Пусть имеется такой код:
int main()
{
constexpr int x = 0;
}
Известно, что значение x вычисляется на этапе компиляции и что constexpr - типобезопасная замена #define. Также x - локальная переменная, локальные переменные выделяются на стеке.
Где будет храниться значение x? На стеке? По идее не должно быть так, потому что это работает как #define, а дефайны на стеке не выделяются. Есть ли класс памяти у constexpr единиц хранения?
С формально-абстрактной точки зрения вы предоставили определение локального объекта, которое трактуется по общим правилам для локальных объектов - 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 и храниться где-то совсем не обязан.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Начал недавно учиться программировать на c++ при выборе функции enter() во второй раз, моя программа выдаёт ошибку vector subscript out of range
В среде MVS2015 следующий код и вообще любой подобный:
Не могу понять причину, почему при делении вещественных чисел результат сам по себе округляется до 5 знаков после запятой