GCC __attribute __((模式(XX))实际上做了什么?

时间:2010-12-30 00:17:02

标签: c attributes c99 bignum

这源于今天早些时候关于bignum图书馆和gcc特定的C语言攻击主题的问题。具体来说,使用了这两个声明:

typedef unsigned int dword_t __attribute__((mode(DI)));

在32位系统上

typedef unsigned int dword_t __attribute__((mode(TI)));

在64位系统上。

我认为,鉴于这是C语言的扩展,无法实现当前(C99)标准中的任何目标。

所以我的问题很简单:这个假设是否正确?这些陈述对底层内存有何影响?我认为结果是我在32位系统中2*sizeof(uint32_t)和64位系统dword,我是否正确?

2 个答案:

答案 0 :(得分:27)

这些允许您显式指定类型的大小,而不依赖于编译器或机器语义,例如“long”或“int”的大小。

他们的描述相当不错on this page

我引用那页:

  

QI:一个宽的整数   最小的可寻址单元,通常为8   位。

     

HI:一个整数,宽度的两倍   QI模式整数,通常为16位。

     

SI:一个整数,是QI的四倍宽   模式整数,通常为32位。

     

DI:An   整数,是QI的八倍宽   模式整数,通常为64位。

     SF:A   浮点值,与SI一样宽   模式整数,通常为32位。

     DF:A   浮点值,与DI一样宽   模式整数,通常为64位。

所以DI基本上是sizeof(char) * 8

可以找到TI模式的进一步说明here(可能比第一个链接更好,但都提供参考)。

所以TI基本上是sizeof(char) * 16(128位)。

答案 1 :(得分:2)

@haelix刚看完这个问题,我也试着理解这个问题。通过阅读:您可以在GCC源代码树的[gcc / gcc / machmode.def]中找到定义。对于'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.