【问题标题】:What does GCC __attribute__((mode(XX)) actually do?GCC __attribute__((mode(XX)) 实际上做了什么?
【发布时间】:2011-06-01 08:03:55
【问题描述】:

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

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)dword ,在 64 位系统中为 2*sizeof(uint64_t) ,对吗?

【问题讨论】:

    标签: c attributes c99 bignum


    【解决方案1】:

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

    他们的描述相当好on this page

    我从那个页面引用:

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 正是我需要的,+1。那么,有没有“标准”的方法来解决这个问题,我接受吗?即声明一个 128 位类型?在目前的使用中,我们可以安全轻松地dword = word << 1;如果可以的话,我宁愿不要用函数等替换它。
    • @Ninefingers:在 GCC 中你可以使用 __int128 我相信:gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html
    • @Ninefiningers:GCC 支持扩展类型__int128_t__uint128_t(至少在 64 位平台上,不确定 32 位目标)
    • __attribute__((mode(SD))) 呢?
    • @haelix 与 SF 相同,但适用于双打?
    【解决方案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.
    

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 2020-11-21
      • 2015-02-26
      • 2017-06-29
      • 2013-06-13
      • 2021-10-25
      • 2011-08-12
      • 1970-01-01
      • 2010-11-27
      相关资源
      最近更新 更多