Сколько копий автоматически сгенерированного оператора присваивания в C ++ (MS Visual Studio 2008)? - PullRequest
1 голос
/ 23 января 2012

Если у меня есть класс C ++ POD (Plain Old Data) Foo, то общепринятым мнением является то, что нет необходимости определять для него конструктор копирования или оператор присваивания, потому что C ++ сделает это автоматически.

Мой вопрос: если Foo.h включено в несколько файлов .cpp и оператор присваивания Foo вызывается в каждом из этих файлов .cpp, VS2008 сгенерирует несколько копий оператора присваивания по умолчанию в результате .obj файлов? (Я работаю над очень большим проектом и пытаюсь уменьшить размер двоичных файлов, создаваемых во время сборки.)

Ответы [ 2 ]

3 голосов
/ 23 января 2012

Оператор будет передаваться во все эти файлы .obj (как и любая другая встроенная функция).Однако все эти функции, кроме одной, будут отброшены компоновщиком (если у вас включена оптимизация).

2 голосов
/ 23 января 2012

Это зависит от компилятора и параметров, используемых для вызова компилятора. Генерируемые компилятором функции считаются объявленными inline, но что это означает с точки зрения сгенерированного кода полностью зависит от компилятор.

Большинство компиляторов имеют возможность ничего не делать встроенными (так что вы, вероятно, получить только одну копию). Однако уменьшит ли это код зависит; если сгенерированный конструктор очень прост, генерируем его встроенный может потребовать меньше места, чем код, необходимый для вызова не встроенная копия.

Большинство компиляторов также имеют опции для оптимизации пространства, а не время выполнения (/O1 /Os для VC ++, например; или -Os для g ++). Я бы начните с их использования.

...