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, а не по причине, которую вы подозреваете.

Другие вопросы по тегам