Что на самом деле делает атрибут 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 19

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.