Re[4]: Откуда эта лютая любовь к знаковым целым?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 07.05.20 15:06
Оценка:
Здравствуйте, Alexander G, Вы писали:

N>>Именно в C и C++ у знаковых принципиально лучше с точки зрения производительности, что позиция, что программист всегда позаботился о переполнениях, позволяет массу оптимизаций, типа замены a+1>a на true. Были отзывы о получении 20-50% выигрыша на этом в отдельных характерно интересных случаях.

AG>Ха, интересно, про неопределённость роловера для знаковых и определённость для беззнаковых уловил.
AG>Интересно, как далеко можно пойти на этом неопределённом переполнении знаковых, но принял к сведению.

Ну вот пример набора оптимизаций. Реально их ещё больше.

AG>(MSVC похоже никуда не идёт, он тупо делает реальное сравнение в обоих случаях a + 1 > a)


Ну, похоже, MSVC сильно отстал. Хотя это какого года версия? Они с 2015 кричат про переход на SSA, там многое должно заметно поменяться.

N>>Что сравнивали-то? Intel рисует (почти) противоположное — для длинного умножения времена одинаковы, а для короткого (которому пофиг на знак) на 1-2 такта меньше (3 вместо до 5).

AG>Обычное деление достаточно больших чисел int64_t / uint64_t, компиляция MSVC x64, беззнаковые ощутимо быстрее. Нужно воспроизвести?

Это уже речь про деление, а перед этим было про умножение

Вообще, если настроение, киньте код, я сверю в своих условиях.

AG>>>С точки зрения корректности, знаковые как бы ограждают от одного типа ошибок (отрицательное число -> переполнение), но вносят другие (отрицательное число -> выход за диапазон), шило на мыло.

N>>А у положительного переполнение у обоих. А так как мелкие числа, включая отрицательные, чаще, чем крупные, то знаковые числа заведомо выигрывают.
AG>В положительную сторону переполняются одинаково. Что до отрицательной, неожиданное отрицательное число, чуть-чуть вышедшее за диапазон, даёт больше вреда, чем такое же положительное, при тех же условиях вышедшее в огромные значения.

А как может положительное "выйти в огромные значения", если нет перехода через границу?
А если есть переход или хотя бы подозрение на него...
Опять же похвалю GCC и Clang — совершенно гениальная придумка (особенно если учесть вариант с тремя разными типами), такое в стандарты надо было ещё лет 20 назад вогнать. И от MS, боюсь, ещё долго не дождаться.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.