Срок хранения и инициализация элемента структуры в переполнении стека

#include <iostream>

using namespace std;

struct A {
// Some Other Code
int x;
};

A a1;

int main(){
A a2;
cout << "a1.x = " << a1.x << endl;
cout << "a2.x = " << a2.x << endl;
return 0;
}

Стандарт C ++ 14 (ISO / IEC 14882: 2014), раздел 8.5, пункт 12:

Если для объекта не указан инициализатор, объект инициализируется по умолчанию. Когда хранилище для объекта с автоматической или динамической продолжительностью хранения получено, объект имеет неопределенное значение, и если для объекта не выполняется инициализация, этот объект сохраняет неопределенное значение до тех пор, пока это значение не будет заменено (5.17). [Примечание: объекты со статическим или потоковым хранением инициализируются нулями, см. 3.6.2. — конец примечания]

Так же a1 имеют статическую длительность хранения и делает a2 есть автоматическая продолжительность хранения? Определение Struct A находится в глобальном пространстве имен, а также a1 декларация, а a2 объявление находится в области видимости блока (внутри main() функция).

Также в разделе 3.6.2 сказано:

Пункт 1:

Нелокальные переменные со статической продолжительностью хранения инициализируются
как следствие инициации программы.

Параграф 2:

Переменные со статической продолжительностью хранения (3.7.1) или продолжительностью хранения потока (3.7.2) должны быть инициализированы нулями (8.5), прежде чем произойдет любая другая инициализация.

Кроме того, с gcc 5.4.0 я получаю предупреждение (warning: 'a2.A::x' is used uninitialized in this function [-Wuninitialized]) и случайное значение, но с Clang 3.8.0 выход всегда a2.x = 0 (ноль также может быть неопределенным значением). Я также сделал другие более сложные эксперименты, с вложенными structs и инициализации по умолчанию помещены в // Some Other Code, Иногда я получаю случайные значения, а иногда (не пренебрежимо малое число) я получаю ноль.

  • Какова продолжительность хранения структуры A? И это из объектов a1 а также a2? И это из переменных a1.x а также a2.x?

  • Шоуде a1.x а также a2.x быть инициализированным нулями? Или они неопределенные ценности?

  • Применяются ли те же правила к class а также union?

  • Имеет ли это какое-то значение код в // Some Other Code? Например, если класс T «имеет нестатические члены с инициализаторами по умолчанию» (как в struct A { int b = 1; int x; };) тогда конструктор по умолчанию не может быть тривиальным (то есть не может выполнять никаких действий). Будет ли этот нетривиальный конструктор также инициализировать x? Тривиальный конструктор по умолчанию

Интересные ссылки:

Инициализация структуры C ++

Инициализация значений по умолчанию в структуре

Являются ли члены структуры C ++ инициализированы в 0 по умолчанию?

Инициализация по умолчанию типов POD в C ++

Инициализация объектов со статической длительностью хранения в C против C ++

C и C ++: частичная инициализация автоматической структуры

Как инициализировать структуры для всех элементов — ноль или ноль

2

Решение

Так есть ли у a1 статическая продолжительность хранения и есть ли у a2 автоматическая продолжительность хранения?

Определение структуры A находится в глобальном пространстве имен …

Это не имеет значения.

… находится в глобальном пространстве имен, а также a1 декларация

a1 имеет статическую длительность хранения и инициализируется нулями.

в то время как a2 объявление находится в области видимости блока

a2 является нестатической блочной локальной переменной Он имеет автоматическую продолжительность хранения и инициализируется по умолчанию. Это имеет неопределенное значение.


Какова продолжительность хранения структуры A?

Типы не имеют срока хранения. Объекты делают.

… И это из объектов a1 а также a2?

Смотри выше.

.. И это из переменных a1.x а также a2.x?

Субобъекты, включая не статические члены данных, наследуют время жизни своего суперобъекта.

… Шоуде a1.x а также a2.x быть инициализированным нулями? Или они неопределенные ценности?

a1 инициализируется нулем. Это включает в себя его подобъекты. a2 не является. Это включает в себя его подобъекты.

Применяются ли одни и те же правила к классу и союзу?

Тот же набор правил применяется к объектам объединяющих и не объединяющих классов, а также не относящихся к классам типов, когда речь идет о классах хранения. Существуют различия в том, что означает инициализация по умолчанию для разных типов.

Имеет ли какое-либо значение код в // Some Other Code? Например, если конструктор класса T «имеет нестатические члены с инициализаторами по умолчанию», то конструктор по умолчанию не может быть тривиальным (то есть не выполнять никаких действий).

Нетривиальный конструктор по умолчанию, сгенерированный компилятором по умолчанию, инициализирует элементы, которые не имеют инициализаторов по умолчанию.

4

Другие решения

Какова продолжительность хранения структуры А?

Этот вопрос не имеет смысла, хранение зависит от того, как A используется.


А что за объекты а1 и а2?

a1 имеет статическое хранилище. Смотрите этот вопрос для более подробной информации.

a2 имеет автоматическое хранение.


А что за переменные a1.x и a2.x?

Они хранятся так же, как их родитель A пример.


Применяются ли одни и те же правила к классу и союзу?

Да.

2

По вопросам рекламы [email protected]