У меня есть общий вопрос, который может быть немного специфичным для компилятора. Меня интересуют условия, при которых будет вызываться конструктор. В частности, в режиме режим/сборки, оптимизированные для скорости, всегда будет вызываться созданный компилятором или пустой конструктор при создании экземпляра объекта?Являются ли пустые конструкторы, всегда вызываемые в C++?
class NoConstructor
{
int member;
};
class EmptyConstructor
{
int member;
};
class InitConstructor
{
InitConstructor()
: member(3)
{}
int member;
};
int main(int argc, _TCHAR* argv[])
{
NoConstructor* nc = new NoConstructor(); //will this call the generated constructor?
EmptyConstructor* ec = new EmptyConstructor(); //will this call the empty constructor?
InitConstructor* ic = new InitConstructor(); //this will call the defined constructor
EmptyConstructor* ecArray = new EmptyConstructor[100]; //is this any different?
}
Я много раз искал и некоторое время просматривал сгенерированный код сборки в Visual Studio. Тем не менее, это может быть сложно выполнить в сборках релизов.
Итого: Является ли конструктор всегда называемым? Если да, то почему?
Я понимаю, что это очень сильно зависит от компилятора, но, безусловно, есть общая позиция. Любые примеры/источники, которые вы можете привести, будут действительно оценены.
Если вы не возражаете против моего запроса, это просто праздное любопытство или качество вашего готового продукта зависит от того, оптимизирует ли этот компилятор для этого? – Blrfl
Немного обоим. Я пишу класс массива (как упражнение), который использует нечто похожее на boost :: is_pod <>, чтобы решить, следует ли использовать специализированную специализацию с реализацией, использующей memswap/memcopy, вместо явного вызова конструкторов/деструкторов/операторов присваивания. Меня заинтересовало то, насколько сильно это повлияло на производительность для типов контейнеров. – JBeFat
Надеюсь, вы не так динамично выделяете это в своей реальной программе. – GManNickG