【问题标题】:How to generate warning if a structure is declared without "__attribute__(align(8))"如果在没有“__attribute__(align(8))”的情况下声明结构时如何生成警告
【发布时间】:2014-01-31 09:17:05
【问题描述】:

如果结构声明没有__attribute__(align(8)),我希望编译器为我生成警告。

例如,如果一个结构是这样声明的:

struct my_float {
        float number;
}  __attribute__((aligned(8)));

它不会产生任何警告。但是如果我声明另一个这样的结构:

struct my_float {
        float number;
};

编译器会为我生成一个警告。

我的工作环境是 linux/GCC。

【问题讨论】:

  • 我不相信这是可能的。据我所知,没有办法在每个 struct 定义上强制一个属性。不幸的是,也没有命令行开关来设置它(例如,与打包不同)。但是,我不确定您为什么需要这样的东西。
  • 为什么这对我很重要? 1)我的机器上运行了两个程序,一个是 32 位,另一个是 64 位,它们有一些共享结构。现在需要根据 64 位配置来对齐这些共享结构。
  • 你在说什么? 64 位机器并不意味着所有内容都需要 8 字节对齐。事实上,通常大多数类型(包括intfloat)具有完全相同的大小和对齐方式。较大的类型(例如 *nix 上的 long int)可能也需要不同的对齐方式,但大小差异是一个更大的问题。
  • @iDebD_gh 啊,所以 OS X 增加了long long 的对齐而不增加大小。我仍然认为你不应该盲目地增加所有东西的对齐方式,只有在 32/64 位中具有不同对齐方式的类型。您甚至可以进行自动化测试,以确保相关结构具有正确的大小和对齐方式。
  • 您发布的有关磁盘上文件的链接与数据对齐无关。保存到磁盘时对齐没有意义。您应该更关心填充,但您没有将原始结构保存到磁盘,是吗?部分还说:“最后,永远不要低估通用交换格式的便利性”

标签: c linux gcc compiler-construction


【解决方案1】:

我认为您不能自动检查所有结构,但您仍然可以手动检查对齐方式,例如:

// x % 16 <=> x & (16-1)  (avoid using modulo operator)
#define MODULO_16_MASK 0xFU
ASSERT_COMPILE((sizeof(my_float) & MODULO_16_MASK) == 0);

如果您的结构未对齐,这应该会在编译时触发警告。

【讨论】:

    【解决方案2】:

    根据经验,这是不可能的。 此属性为指定类型的变量指定最小对齐方式(以字节为单位)。

    struct S { short f[3]; } __attribute__ ((aligned (8)));
    typedef int more_aligned_int __attribute__ ((aligned (8)));
    

    强制编译器分配每个类型为 struct S 或 more_aligned_int 的变量并至少在 8 字节边界上对齐。

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 2013-12-22
      • 2021-11-22
      • 2023-02-24
      • 1970-01-01
      • 2017-10-29
      • 2019-05-14
      • 1970-01-01
      相关资源
      最近更新 更多