Может ли компилятор 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 это невозможно.
В коде
#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 это невозможно.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Неожиданный вывод, когда данные std::cout float32 дважды заменены на _mm_shuffle_pi16.
Anonymous » » в форуме C++ - 0 Ответы
- 46 Просмотры
-
Последнее сообщение Anonymous
-