Инициализация типов POD в списках инициализации конструктора - PullRequest
0 голосов
/ 06 января 2019

Я нахожу множество статей и вопросов 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.

1 Ответ

0 голосов
/ 06 января 2019

Так что, если у меня есть класс ...

MyClass() : anArrayOfInt() {}

... что я могу знать о состоянии anInt после создания объекта MyClass?

Вы инициализировали значение элемента, поэтому мы знаем, что он содержит нули.

Мне нужно точно знать, что запись списка инициализации "anArrayOfInt ()" гарантированно обнуляет байты anArrayOfInt, или, если это просто поведение GCC, и я не могу рассчитывать на это на других компиляторах.

Да, инициализация значения гарантирует, что целые числа инициализируются нулем.

...