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

时间:2014-03-19 16:28:40

标签: 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)));

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

warning: ignoring attributes on template argument '_STRUCT' [enabled by default]

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

2 个答案:

答案 0 :(得分:4)

根据C++ PATCH for c++/48138 (losing __attribute ((aligned)) on template argument),这似乎是有目的的,其中说:

  

...除了我们不想保留模板类型参数的属性,因为它们不是修改的一部分,因此您可以获得类型相同的类模板实例化,而不管参数的对齐,但有效参数取决于首先使用哪个对齐来实例化它。

     

当我们删除属性时PR会建议一个警告,这是有道理的。在功能模板的情况下,此补丁尚未提供警告,但对于类模板也是如此。功能模板的警告将等到Nathan的补丁之后,以改进模板重载诊断。

所以似乎警告是新的,但处理的方式是相同的。

答案 1 :(得分:3)

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

  

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

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

这导致答案__attribute__(aligned(16))的位置是关键。 如果我把它放在关键字struct或结束花括号之后,警告就会消失,例如:

typedef struct __attribute__((aligned (16))) _STRUCT
{

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

    uint32_t    a;
    uint32_t    b;
} __attribute__((aligned (16))) STRUCT;

前者是海湾合作委员会文件的建议。 http://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html

  

对于枚举,结构或联合类型,您可以在枚举,结构或联合标记与类型名称之间指定属性,或者仅在定义的结束大括号之后指定属性。以前的语法是首选。

所以情况是,前一个实现设置了typedef的对齐方式,解决方案设置了struct的对齐方式,这首先是目标。