Что на самом деле делает атрибут GCC ((mode(XX))?
Это произошло из-за вопроса, заданного ранее сегодня на тему библиотек bignum и специфических хаков gcc для языка C. В частности, использовались следующие два заявления:
typedef unsigned int dword_t __attribute__((mode(DI)));
На 32-битных системах и
typedef unsigned int dword_t __attribute__((mode(TI)));
На 64-битных системах.
Я предполагаю, что это расширение языка Си, что не существует способа достичь того, чего он достигает в текущих стандартах (C99).
Итак, мои вопросы просты: верно ли это предположение? И что означают эти утверждения что делать с глубинной памятью? Я думаю, что результат у меня есть2*sizeof(uint32_t)
для dword
в 32-битных системах и 2*sizeof(uint64_t)
для 64-битных систем, я прав?2 ответа:
Они позволяют явно указать размер для типа, не зависящий от семантики компилятора или машины, например размер 'long' или 'int'.
Они довольно хорошо описаны на этой странице.
Цитирую с этой страницы:
QI: целое число, которое имеет ширину, равную наименьшая адресуемая единица, обычно 8 биты.
Привет: целое число, в два раза больше, чем целое число режима QI, обычно 16 бит.
SI: целое число, в четыре раза больше, чем a ЦИ режим целочисленный, обычно 32 бита.
DI: An целое число, в восемь раз шире Ци режим целочисленный, обычно 64 бита.
SF: A значение с плавающей запятой, шириной с Си режим целочисленный, обычно 32 бита.
DF: A значение с плавающей запятой, шириной с DI режим целочисленный, обычно 64 бита.
Таким образом,
DI
по существу являетсяsizeof(char) * 8
.Дальнейшее объяснение, включая
TI
режим, можно найти здесь (возможно, лучше, чем первое звено, но оба предоставлено для справки).Таким образом,
TI
по существу являетсяsizeof(char) * 16
(128 бит).
@haelix только что прочитал этот вопрос, и я также попытался понять эту вещь. По моему прочтению: вы можете найти определения в [gcc/GCC / machmode.def] в исходном дереве GCC. Для "SD" это должно быть:
/* Decimal floating point modes. */ DECIMAL_FLOAT_MODE (SD, 4, decimal_single_format);
И 'DECIMAL_FLOAT_MODE' говорит:
DECIMAL_FLOAT_MODE (MODE, BYTESIZE, FORMAT); declares MODE to be of class DECIMAL_FLOAT and BYTESIZE bytes wide. All of the bits of its representation are significant.