¿Qué hace GCC__attribute__((mode(XX)) en realidad?
attributes c99 (2)
@haelix Acabo de leer esta pregunta y también traté de entender esto. Por mi lectura: puede encontrar las definiciones en [gcc / gcc / machmode.def] en el árbol de fuentes de GCC. Para ''SD'' debería ser:
/* Decimal floating point modes. */
DECIMAL_FLOAT_MODE (SD, 4, decimal_single_format);
y ''DECIMAL_FLOAT_MODE'' dice:
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.
Esto surgió de una pregunta anterior sobre el tema de las bibliotecas bignum y hacks específicos de gcc para el lenguaje C. Específicamente, se utilizaron estas dos declaraciones:
typedef unsigned int dword_t __attribute__((mode(DI)));
En sistemas de 32 bits y
typedef unsigned int dword_t __attribute__((mode(TI)));
En sistemas de 64 bits.
Supongo que, dado que esta es una extensión del lenguaje C, no existe ninguna forma de lograr lo que logra en los estándares actuales (C99).
Así que mis preguntas son simples: ¿es correcta esa suposición? ¿Y qué hacen estas afirmaciones a la memoria subyacente? Creo que el resultado es que tengo 2*sizeof(uint32_t)
para una dword
en sistemas de 32 bits y 2*sizeof(uint64_t)
para sistemas de 64 bits, ¿estoy en lo cierto?
Estos le permiten especificar explícitamente un tamaño para un tipo sin depender de la semántica del compilador o de la máquina, como el tamaño de ''largo'' o ''int''.
Se describen bastante bien en esta página .
Cito de esa página:
QI: un entero que es tan ancho como la unidad direccionable más pequeña, generalmente 8 bits.
HI: Un entero, dos veces más ancho que un entero del modo QI, generalmente de 16 bits.
SI: Un entero, cuatro veces más ancho que un entero del modo QI, generalmente de 32 bits.
DI: Un entero, ocho veces más ancho que un entero de modo QI, generalmente de 64 bits.
SF: un valor de punto flotante, tan ancho como un entero de modo SI, generalmente de 32 bits.
DF: Un valor de punto flotante, tan ancho como un entero de modo DI, generalmente de 64 bits.
Entonces, DI
es esencialmente sizeof(char) * 8
.
here se puede encontrar una explicación más detallada, incluido el modo TI
(posiblemente mejor que el primer enlace, pero ambos se proporcionan como referencia).
Entonces, TI
es esencialmente sizeof(char) * 16
(128 bits).