2015-08-16 2 views
1

Был с ++ код, который выглядел что-то вроде этого in a tutorial video (номера строк добавлены для ясности):Сколько экземпляров объектов создается здесь?

1. Config defaultConfig("/etc/foobar/config"); 
2. Config userConfig("~/.config/foobar/config"); 
3. Config conf; 
4. /* Do something else not involving `conf` */ 
5. conf = defaultConfig.join(userConfig); 

Мой вопрос, сколько экземпляров Config класса создаются?

В этом случае функция join возвращает новый экземпляр Config, а не модифицирует существующий, поэтому создается не менее 3 объектов.

Мой вопрос о третьей строке (Config conf;). C++ автоматически создает экземпляр Config на этой строке (хотя на другом языке, таком как Java, вам придется вручную указать ему, чтобы назначить new Config())? Или компилятор c++ достаточно умен, чтобы понять, что объект conf никогда не доступен, но вместо этого заменяется на строке # 5?

Сколько выделено памяти? Достаточно для трех ссылок и четырех экземпляров Config, или там больше происходит за кулисами?

+0

Ответ не может быть определен кодом, который вы опубликовали. Это особенно важно из-за строки 5. Мы не знаем, как объявляется «join», если он принимает значение «Config» по значению или нет. Мы не знаем, будет ли компилятор оптимизировать копии и т. Д. И т. Д. – PaulMcKenzie

ответ

0

Линии 1 и 2: вы не можете сказать, как работают эти функции, поэтому они создают по меньшей мере 1 объект каждый. Они будут «помещены в стек», что означает примерно то, что они будут уничтожены, когда выполнение оставляет область, в которой они были объявлены. Строка 3: Config conf; означает, что новый объект Config создается с использованием конструктора по умолчанию класса Config.

+0

Итак, это означает, что создаются 4 экземпляра класса и 4 «куска» выделенной памяти? – IQAndreas

+0

@ IQAndreas: Да, но четвертый будет временным (до его назначения в третий) и может быть полностью оптимизирован. –

1

C++ не является Java, поэтому здесь нет ссылок, просто объектов класса. Как вы говорите, есть вероятные 3 + 1 объекты, созданные вашим кодом.

Вы можете отложить создание третьего объекта, не объявляя ее до тех пор, пока это необходимо, путем удаления строки 3 и делая линию 5

Config conf = defaultConfig.join(userConfig); 

Таким образом, будет очень вероятно, будет только 3 объектов, созданных.

+0

Может быть больше объектов, в зависимости от того, как объявлен параметр 'join'. – PaulMcKenzie

+0

@PaulMcKenzie - Может быть любое количество объектов, если 'join' создает дополнительные копии и хранит где-то в другом месте. :-) –

1

ли C++ автоматически создает экземпляр Config на этой линии

Да, три экземпляра создается в стеке с автоматической продолжительностью хранения.

Или компилятор C++ достаточно умный, чтобы понять, что объект conf никогда не доступен, но вместо этого заменяется на строку # 5?

Возможно нет. Реализации разрешено делать оптимизации, которые не влияют на конечный результат, но здесь объект инициализирован. (Опять же, это определенно зависит от реализации и компилятора.)

Сколько выделено памяти? Достаточно для трех ссылок и четырех экземпляров Config, или там больше происходит за кулисами?

Трудно сказать.По меньшей мере три, но, возможно, четыре для возвращаемого значения от join (который затем будет назначен conf, если все было неоптимизировано).

+0

_ "на стеке" _ Это деталь реализации. Просто оставьте часть продолжительности хранения. –

+0

_ "но здесь объект инициализируется _ _ Где? –

+0

@LightnessRacesinOrbit Вы спрашиваете или говорите, что я должен уточнить, что 'conf' инициализируется в строке 3? –

-1

Линия 1,2,3 создает объект каждый. Строка 5 не приводит к созданию нового объекта в вызывающей функции. Элементы данных существующего объекта conf будут перезаписаны элементами данных объекта, возвращаемого join(). Таким образом, в общей сложности, после того, как линии 5, 3 объекта присутствуют в памяти

Концепция вид похож на тот, в коде ниже: -

int x = 5; 
int y = 10; 
x = sum(x,y); //adds x,y and returns 15 

Теперь, в приведенном выше коде, третий строка не создает новую переменную и хранит в ней 15. Он просто перезаписывает существующее значение переменной x. Надеюсь, это прояснит ситуацию.

+0

_ «Строка 5 не приводит к созданию нового объекта». _ Вы этого не знаете. ОП на самом деле предлагает иное. –

+0

'Строка 5 не приводит к созданию нового объекта.' Откуда вы это знаете?Вы не знаете, принимает ли 'join' значение' Config', поэтому более вероятно создаст новый (временный) объект. – PaulMcKenzie

+0

Я имею в виду для вызывающей функции, это не приводит к созданию нового объекта. Конечно, внутри «join» создается новый объект, но не в вызывающей функции. –

1

Достаточно для трех ссылок и четырех экземпляров Config, или там больше происходит за кулисами?

Ничего себе, да, вы действительно исходите из Явы. Здесь нет «ссылок». Это намного проще.

Предполагая, что join возвращается по значению:

  • У вас есть три Config объекты, полностью объявленные и выделенные на первых трех линиях;
  • A четвертый Config объект создается в join звоните, как временный; он не будет жить очень долго, потому что, как только он используется для назначения в третьем объекте, он уничтожается;
  • join может включать дополнительные временные экземпляры, особенно если он принимает значение userConfig по стоимости, но мы не можем видеть это из вашего вопроса.

Итак, в целом вы создаете четыре или более объектов, но к тому моменту, когда ваша функция заканчивается, вы, конечно, имеете только три слева.

Смежные вопросы