Может ли компилятор C++ предположить, что стандартные функции не были заменены и имеют другую семантику?C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Может ли компилятор C++ предположить, что стандартные функции не были заменены и имеют другую семантику?

Сообщение Гость »


В коде

#include #include #include статический int foo = 2; int bar(int x) { вернуть х*фу; } недействительный баз () { //printf("%p\n", &foo); std::vector ptrs{&foo}; std::sort(ptrs.begin(), ptrs.end()); } g++ сгенерирует для bar реальный код умножения; однако, комментируя вызов printf std::sort, код оптимизируется для константы 2: это имеет смысл, поскольку известно, что, учитывая отсутствие «законного» способ изменить содержимое статической переменной foo (никто не знает ее адреса), превращает foo в константу, даже если она не объявлена ​​явно как таковая.

Мой вопрос... было бы законно, если бы компилятор C++ предположил, что printf std::sort не подойдет странные вещи, такие как сохранение переданного адреса и использование его позже или немедленно для изменения содержимого объекта int, на который он указывает, или совместимый компилятор C++ ДОЛЖЕН быть таким же параноиком, как g++?
Изменить
Изменено с printf("%p\n", &foo); на sort, поскольку вывод действительно может быть перенаправлен, указатель перестроен и foo мутирует даже при использовании «легального» кода C++, если выполняется вызов printf.

В стандартной версии std::sort это невозможно.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»