GCC __attribute __((模式(XX))实际上做了什么?
这源于今天早些时候关于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位系统中使用2*sizeof(uint64_t)
,我是否正确?
这些允许您显式指定类型的大小,而不依赖于编译器或机器语义,例如“long”或“int”的大小。
它们在本页面上描述得相当不错。
我从那个页面引用:
QI:与最小可寻址单元一样宽的整数,通常为8位。
HI:一个整数,是QI模式整数的两倍,通常是16位。
SI:整数,是QI模式整数的四倍,通常是32位。
DI:一个整数,是QI模式整数的八倍,通常是64位。
SF:浮点值,与SI模式整数一样宽,通常为32位。
DF:浮点值,与DI模式整数一样宽,通常为64位。
因此DI
基本上是sizeof(char) * 8
。
这里可以找到进一步的解释,包括TI
模式(可能比第一个链接更好,但都提供了参考)。
因此TI
基本上是sizeof(char) * 16
(128位)。
@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.