Гарантирует ли C ++ стандартная инициализация байтов прокладки до нуля для нестатических агрегатных объектов?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Гарантирует ли C ++ стандартная инициализация байтов прокладки до нуля для нестатических агрегатных объектов?

Сообщение Anonymous »

поддерживает ли C ++ языковую конструкцию, которая позволит нам инициализировать объект, и все его поля накладки до нуля. Я обнаружил некоторую обнадеживающую формулировку в cppreference.com о нулевой инициализации, которая предполагает, что в некоторых условиях байты прокладки также будут обнуляны. start = "2">
[*] Как часть последовательности инициализации значений для неклассовых типов и для членов типов инициализированных классов, которые не имеют конструкторов, включая инициализацию значений элементов агрегатов, для которых не предоставляется инициализаторы. Тип, начальным значением объекта является интегральная постоянная ноль, явно преобразованная в t. < /li>
Если t-тип класса, не сознав, все базовые классы и нестатические элементы данных нулевые инициализированы, а вся прокладка инициализируется до нулевых бит. Конструкторы, если таковые имеются, игнорируются. < /Li>
...
< /ul>
< /blockquote>
Найдут ссылки на нулевую инициализацию в инициализации стоимости, агрегат-инициализации и инициализации списка. Компиляторы, и их поведение кажется расходящимся. А вот и результаты: < /p>
дано: foo < /p>

Код: Выделить всё

struct Foo
{
char x;
int y;
char z;
};
< /code>




 construct < /th>
 g ++ < /th>
 clang ++ < /th>
< /tr> < /br />

 clang ++ < /th>
< /br />
 < /th>
< /tr> < /br />
 < /th>
/> 

 foo () < /td>
x:[----][0x42][0x43][0x44],v: 0

Код: Выделить всё

x:[----][----][----][----],v: 0< /code> < /td>
< /tr>

 < /td>
y:[----][----][----][----],v: 0

Код: Выделить всё

y:[----][----][----][----],v: 0< /code> < /td>
< /tr>

 < /td>
z:[----][0x4A][0x4B][0x4C],v: 0

Код: Выделить всё

z:[----][----][----][----],v: 0< /code> < /td>
< /tr>

 < /td>




Foo{}
x:[----][----][----][----],v: 0

Код: Выделить всё

x:[----][0x42][0x43][0x44],v: 0< /code> < /td>
< /tr>

 < /td>
y:[----][----][----][----],v: 0

Код: Выделить всё

y:[----][----][----][----],v: 0< /code> < /td>
< /tr>

 < /td>
z:[----][----][----][----],v: 0

Код: Выделить всё

z:[----][0x4A][0x4B][0x4C],v: 0





здесь [----] представляет байт, содержащий все биты 0, и [0x ..] значение для мусора. Оба foo () и foo {} являются инициализацией значения. Кроме того, foo {} является агрегатной инициализацией, с отсутствующими инициализаторами. Почему правило нулевой инициализации не запускается? Почему правило прокладки не запускается? 2: Также см.: Инициализирует ли C -структура. Применимо ли это?>

Подробнее здесь: https://stackoverflow.com/questions/709 ... ro-for-non
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»