Подтвердить что ты не робот

Что делает 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-битных систем, правильно ли я?

4b9b3361

Ответ 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.