Pull to refresh

Comments 1

Выбросить инструкцию BOUND было очевидно хорошим решением по двум причинам: (1) она реализуется неприлично длинной последовательностью микрокода и (2) компиляторы её не используют.

(1) легко заметить, если посмотреть на семантику. Как минимум, нужно две загрузки из памяти, два сравнения и условная генерация исключения. При этом, пользователь не может никак это оптимизировать, храня границы диапазона в регистрах. Плюс, генерация исключения сама по себе очень дорогая: сброс конвейера и туча обращений в память. Дешевле эту операцию сделать с помощью пары CMP и пары Jcc.

(2) в соответствии со стандартами языков C и C++, на которых пишут большинство критичного к производительности софта, выход за границы массива это неопределённое поведение. Соответственно, компилятор имеет право предполагать, что таких ситуаций в программе никогда не происходит. Следовательно, эти проверки просто не нужны. В частности, и GCC, и clang/llvm их вставляют только если очень хорошо попросить специальной опцией, и при этом часть оптимизаций идёт лесом.

Sign up to leave a comment.

Articles