Я нахожу множество статей и вопросов SO о нулевой и стандартной инициализации типов POD, но я не нашел ни одной, которая обсуждала бы инициализацию типов POD как членов класса в списках инициализации конструктора класса. Я уверен, что, возможно, есть такой вопрос или статья об этом, но я не нашел ни одного.
Так что, если у меня есть класс ...
class MyClass
{
public:
MyClass() : anArrayOfInt() {}
private:
int anArrayOfInt[10];
}
... что я могу знать о состоянии anInt
после создания объекта MyClass
? Эмпирическим тестированием я отметил, что в приведенном выше коде на GCC 6.4.0 anArrayOfInt
- это все нули после создания выделенного в стеке экземпляра MyClass
, но если я изменю код на этот:
class MyClass
{
public:
MyClass() {}
private:
int anArrayOfInt[10];
}
... тогда в выделенных стеке экземплярах больше нет нулей в anArrayOfInt
. В моем реальном случае (который побудил меня написать этот вопрос) это приводит к сбою теста. Я заметил, что если я изменю код следующим образом:
class MyClass
{
public:
MyClass() { memset(anArrayOfInt, 0, sizeof(anArrayOfInt)); }
private:
int anArrayOfInt[10];
}
... тогда мои тесты снова проходят, даже без перечисления anArrayOfInt()
в списке инициализации конструктора. Так что, похоже, мне нужно anArrayOfInt()
в списке инициализации, но прежде чем я вернусь обратно от версии memset()
к версии списка инициализации, мне нужно точно знать, что запись списка инициализации "anArrayOfInt()
" гарантированно равна нулю. байты anArrayOfInt
, или если это просто поведение GCC, и я не могу рассчитывать на это на других компиляторах.
Если это важно, в GCC 6.4.0 мы запускаем модульные тесты, но нашей целью является встроенный компилятор IAR для RX MCU, который все еще находится на C ++ 03-land.