Constexpr локальные переменные

280
22 января 2018, 08:29

Пусть имеется такой код:

int main()
{
    constexpr int x = 0;
}

Известно, что значение x вычисляется на этапе компиляции и что constexpr - типобезопасная замена #define. Также x - локальная переменная, локальные переменные выделяются на стеке.

Где будет храниться значение x? На стеке? По идее не должно быть так, потому что это работает как #define, а дефайны на стеке не выделяются. Есть ли класс памяти у constexpr единиц хранения?

Answer 1

С формально-абстрактной точки зрения вы предоставили определение локального объекта, которое трактуется по общим правилам для локальных объектов - x будет иметь обычный автоматический storage duration, как у обычной локальной переменной. constexpr на это никак не виляет.

А будет ли x фактически где-то храниться - это уже решение принимаемое компилятором. Если объект не является odr-used в программе, то и определения для него не требуется, т.е. фактически хранить его где-либо нет никакой необходимости (независимо от константности такого объекта). То есть говорить о хранении объекта, который не является odr-used - довольно бессмысленное занятие.

В вашем случае x не является odr-used, потому и хранить его нигде фактически не надо. Не существует способа проверить где "хранится" x не сделав x odr-used, т.е. пытаться выяснить это путем эксперимента будет бесполезным занятием - именно ваш эксперимент и будет причиной "хранения".

Вот в такой программе

int main()
{
  constexpr int x = 0;
  int a[x + 1];
  std::cout << x << std::endl;
}

x тоже не является odr-used и храниться где-то совсем не обязан.

READ ALSO
Оконное приложение на С++

Оконное приложение на С++

Выбивает ошибку:

285
Ошибка "Vector subscriptout of range&#39;&#39;

Ошибка "Vector subscriptout of range''

Начал недавно учиться программировать на c++ при выборе функции enter() во второй раз, моя программа выдаёт ошибку vector subscript out of range

260
Не удаётся скомпилировать код с файлом в качестве аргумента main (file.open(argv[1]))

Не удаётся скомпилировать код с файлом в качестве аргумента main (file.open(argv[1]))

В среде MVS2015 следующий код и вообще любой подобный:

246
с++ округляет деление

с++ округляет деление

Не могу понять причину, почему при делении вещественных чисел результат сам по себе округляется до 5 знаков после запятой

228