- Because C++ is designed as a portable language, i.e. one that compiles on many CPUs (e.g. x86, ARM, LSI-11/2, with devices like Game Boys, Mobile Phones, Freezers, Airplanes, Human Manipulation Chips and Laser Swords).
- the available flags across CPUs may largely differ
- даже в пределах одного и того же процессора флаги могут отличаться (возьмите скалярные инструкции x86 против векторных инструкций)
- некоторые процессоры могут вообще не иметь желаемого флага
- Необходимо ответить на вопрос: Должен ли компилятор всегда устанавливать/включать этот флаг, если он не может определить, используется ли он вообще?, что не соответствует плате только за то, что вы использовать неписаный, но священный закон как C, так и C++
- Поскольку компиляторам нужно было бы запретить оптимизировать и, например. переупорядочить код, чтобы сохранить эти флаги действительными
Пример для последнего:
int x = 7;
x += z;
int y = 2;
y += z;
Оптимизатор может преобразовать это в код псевдоассемблера:
alloc_stack_frame 2*sizeof(int)
load_int 7, $0
load_int 2, $1
add z, $0
add z, $1
который, в свою очередь, будет больше похож на
int x = 7;
int y = 2;
x += z;
y += z;
Теперь, если вы запрашиваете регистры между
int x = 7;
x += z;
if (check_overflow($0)) {...}
int y = 2;
y += z;
то после оптимизации и дизассемблирования вы можете закончить следующим образом:
int x = 7;
int y = 2;
x += z;
y += z;
if (check_overflow($0)) {...}
что тогда неверно.
Можно было бы построить больше примеров, например, то, что происходит с переполнением времени компиляции с постоянным свертыванием.
Примечания: я помню старый компилятор Borland C++ с небольшим API для чтения текущих регистров процессора. Тем не менее, приведенная выше аргументация об оптимизации остается в силе.
С другой стороны: чтобы проверить переполнение:
// desired expression: int z = x + y
would_overflow = x > MAX-y;
более конкретно
auto would_overflow = x > std::numeric_limits<int>::max()-y;
или лучше, менее конкретно:
auto would_overflow = x > std::numeric_limits<decltype(x+y)>::max()-y;
person
Sebastian Mach
schedule
01.10.2012