Что на самом деле делает GCC __attribute __ ((mode (XX))? - PullRequest
21 голосов
/ 30 декабря 2010

Это возникло из вопроса ранее сегодня о предмете библиотек bignum и специфичных для gcc хаков на язык Си. В частности, были использованы эти два объявления:

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

Ответы [ 2 ]

27 голосов
/ 30 декабря 2010

Они позволяют вам явно указывать размер для типа без зависимости от семантики компилятора или машины, например, от размера 'long' или 'int'.

Они достаточно хорошо описаны onэта страница .

Я цитирую с этой страницы:

QI: целое число, равное наименьшей адресуемой единице, обычно 8 бит.

HI: целое число, в два раза большее, чем целое число в режиме QI, обычно 16 бит.

SI: целое число, в четыре раза большее, чем целое число в режиме QI, обычно 32 бита.

DI: целое число, в восемь раз большее, чем целое число в режиме QI, обычно 64 бита.

SF: значение с плавающей запятой, равное целому числу в режиме SI, обычно 32 бита.

DF: значение с плавающей запятой, равное целому числу в режиме DI, обычно 64 бита.

Итак, DI по существу sizeof(char) * 8.

Дальнейшее объяснение, включая TI mode, можно найти здесь (возможно, лучше, чем первая ссылка, но обе предоставлены для справки).

То есть TI по существу sizeof(char) * 16 (128 бит).

2 голосов
/ 14 февраля 2015

@ 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.
...