Цитата(dxp @ Jan 20 2011, 09:51)

Что-то я не понял, откуда оверхед. Если есть конструктор, то в нем программист явно указывает, что из представления класса инициализировать и как. Если инициализация массивов не нужна, так и не описывать ее, этот член просто не будет проинициализирован. Насколько я ничего не помню, как-то так.
Чего-то я до конца не понимаю. Для начала несколько цитат из Страуструппа:
1. Глава 10.2.3 Конструкторы
Цитата
Если класс имеет конструктор, все объекты этого класса будут проинициализированны.
2. Глава 10.4.2 Конструкторы по умолчанию
Цитата
Конструктор по умолчанию, сгенерированный компилятором, неявно вызывает конструкторы по умолчанию для членов класса и конструкторы базовых классов. Например:
Код
struct
{
int i;
int vi[10];
Table t1;
Table vt[10];
};
Tables tt;
В этом примере переменная tt будет проинициализированна сгенерированным конструктором по умолчанию, который вызовет Table(15)
(прим. Для класса Table определен конструктор с дефолтовым аргументом 15) для tt.t1 и каждого элемента tt.vt. С другой стороны, tt.i и элементы tt.vi не проинициализированны, потому что их тип не является классом. Причина различной обработки классов и встроенных типов заключается в требовании совместимости с С и в боязни вызвать дополнительные затраты времени на этапе выполнения.
Что на деле. Я запустил MS Visual Studio и нарисовал там простой код:
Код
class JJ
{
private:
int y;
int e[3];
public:
JJ()
{
}
};
JJ j1;
void main()
{
JJ j2;
while(1);
}
Создается два объекта, один на стеке, один глобальный. Определен пустой конструктор по умолчанию, хотя это не играет никакой роли! В результате объект j1 полностью инитится нулями, а j2 не инитится.
Почему для j2 игнорируется цитата 1, а для j1 цитата два?