编译对齐的结构在GCC中给出了奇怪的警告

evo*_*ion 8 c++ gcc struct g++ alignment

我们有多个结构,它们是16字节对齐的.在以前的GCC版本中,一切正常.由于我们升级到GCC 4.8.2(以前我们使用过4.6),我们得到了一些关于这些结构的警告.

一个示例结构如下:

typedef struct _STRUCT
{
    _STRUCT(): a(0),
           b(0) {};

    uint32_t    a;
    uint32_t    b;
} STRUCT __attribute__((aligned (16)));
Run Code Online (Sandbox Code Playgroud)

编译此代码会在使用此strcut时抛出以下警告:

warning: ignoring attributes on template argument '_STRUCT' [enabled by default]
Run Code Online (Sandbox Code Playgroud)

我真的不明白,这个警告试图告诉我什么,搜索谷歌也没有帮助.

evo*_*ion 5

@Shafik Yaghmour 将我推向了正确的方向。检查他提到的补丁的错误报告让我得到了正确的答案:

...但核心问题似乎是不支持 typedef 的对齐。 模板参数上的属性((aligned)) 似乎根本没有效果。

来源:http ://gcc.gnu.org/bugzilla/show_bug.cgi?id=48138

由此得出的答案是:位置__attribute__(aligned(16))是关键。如果我将其放在关键字 struct 或右大括号之后,警告就会消失,例如:

typedef struct __attribute__((aligned (16))) _STRUCT
{
Run Code Online (Sandbox Code Playgroud)

或者

    _STRUCT(): a(0),
               b(0) {};

    uint32_t    a;
    uint32_t    b;
} __attribute__((aligned (16))) STRUCT;
Run Code Online (Sandbox Code Playgroud)

前者是 GCC 文档的建议。http://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html

对于枚举、结构或联合类型,您可以在枚举、结构或联合标记与类型名称之间指定属性,也可以在定义的右花括号后面指定属性。首选前一种语法。

情况是,前一个实现设置了 typedef 的对齐方式,而解决方案设置了结构体的对齐方式,这就是最初的目标。