C++ const оптимизация компилятора
Скажем, у меня есть следующий код:
int foo () {
int const x = 0;
return x;
}
Разрешено ли компилятору перемещать x в глобальную область?
Как насчет следующего сценария? Можно res2
варьироваться в зависимости от оптимизаций?
std::set<int const *> addrs;
int foo () {
int const x = 0;
addrs.insert(&x);
return addrs.size();
}
void bar () {
int res1 = foo();
int res2 = foo();
}
1 ответ
Нет, компилятор не может переместить его в глобальной области видимости, потому что переменная не объявлена в глобальной области видимости. Область не то же самое, что хранение. Область действия указывает, откуда можно получить доступ к переменной - перемещение ее в глобальную область будет означать, что к ней можно получить доступ откуда угодно, а здесь это не так.
Вторая часть программы демонстрирует неопределенное поведение. addrs
содержит висячие указатели после выхода из функции. Так как std::set
сравнивает существующие указатели при вставке, это незаконно. Так что я бы сказал, да, res2
может варьироваться, но из-за UB, а не по причине, которую вы подозреваете.