Что делает GCC __attribute __ ((mode (XX)) на самом деле?
Это возникло из вопроса, который сегодня был ранее рассмотрен на тему библиотек bignum и gcc конкретных хаков на языке C. В частности, эти два объявления были использованы:
typedef unsigned int dword_t __attribute__((mode(DI)));
В 32-битных системах и
typedef unsigned int dword_t __attribute__((mode(TI)));
В 64-битных системах.
Я предполагаю, что это расширение для языка C, что нет никакого способа добиться того, чего он достигнет в текущих (C99) стандартах.
Итак, мои вопросы просты: правильно ли это предположение? И что делают эти утверждения для основной памяти? Я думаю, что результат: у меня 2*sizeof(uint32_t)
для dword
в 32-битных системах и 2*sizeof(uint64_t)
для 64-битных систем, правильно ли я?
Ответы
Ответ 1
Это позволяет явно указывать размер для типа, не зависящего от семантики компилятора или машины, такой как размер "long" или "int".
Они описаны довольно хорошо на этой странице.
Я цитирую эту страницу:
QI: целое число, которое является таким же широким, как и наименьшая адресуемая единица, обычно 8 биты.
HI: целое число, вдвое большее целое число QI, обычно 16 бит.
SI: целое число, в четыре раза превышающее QI mode integer, обычно 32 бит.
DI: целое число, в восемь раз превышающее QI mode integer, обычно 64 бит.
SF: A значение с плавающей запятой, столь же широкое, как SI mode integer, обычно 32 бит.
DF: A значение с плавающей запятой, равное ширине DI mode integer, обычно 64 бит.
Итак, DI
по существу sizeof(char) * 8
.
Дальнейшее объяснение, в том числе TI
mode, можно найти здесь (возможно, лучше, чем первая ссылка, но обе предоставлены для справки).
Итак, TI
по существу sizeof(char) * 16
(128 бит).
Ответ 2
@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.