@sadfsy

Что за странная константа?

if (arr[j - 1] > arr[j])
Зачем он для такой строчки на 69, 70ой строчке добавляет к j такую странную константу.
Откуда он ее взял? 1073741824
  • Вопрос задан
  • 137 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Зачем он для такой строчки на 69, 70ой строчке добавляет к j такую странную константу.

В конечном коде выглядит действительно загадочно. Если вызывать компилятор с ключом -fdump-tree-all (фиг знает, как сделать это на godbolt.org, я проверял локально), то уже в самом первом дампе можно увидеть, что if (arr[j - 1] > arr[j]) превращается в это:
if (*(arr + ((sizetype) j + 1073741823) * 4) > *(arr + (sizetype) ((unsigned int) j * 4)))

1073741823 -- это 0x3fffffff, 30 единичных бит, т.е. 30-битная -1. Дальше j + 1073741823 превратилось в
add     r3, r3, #1073741824
subs    r3, r3, #1

т.е. в j + 1073741824 - 1. После умножения на 4 старшие два бита j теряются, но в чём смысл использования 30-битной -1 вместо 32-битной -- мне непонятно.
Поскольку константа появляется ещё до начала архитектурно-зависимых преобразований, она фигурирует в выводе для всех 32-битных архитектур поддерживаемых gcc. Интересно, что это началось между gcc-4.6 и gcc-5, до этого в этом месте генерировался просто sub r3, r3, #1. Ещё интересно, что даже с -O2 эта константа остаётся в сгенерированном коде, а исчезает только с -Os. Выглядит как регрессия.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Это красивое число. Вот так в хексах выглядит 0x40000000.
Скоре всего это какая-то константа из stdio.h, stdlib.h, time.h
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы