我们有多个结构,它们是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]
我真的不明白,这个警告试图告诉我什么,搜索谷歌也没有帮助。
答案 0 :(得分:4)
根据C++ PATCH for c++/48138 (losing __attribute ((aligned)) on template argument),这似乎是有目的的,其中说:
...除了我们不想保留模板类型参数的属性,因为它们不是修改的一部分,因此您可以获得类型相同的类模板实例化,而不管参数的对齐,但有效参数取决于首先使用哪个对齐来实例化它。
当我们删除属性时PR会建议一个警告,这是有道理的。在功能模板的情况下,此补丁尚未提供警告,但对于类模板也是如此。功能模板的警告将等到Nathan的补丁之后,以改进模板重载诊断。
所以似乎警告是新的,但处理的方式是相同的。
答案 1 :(得分:3)
...但核心问题似乎是不支持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的对齐方式,这首先是目标。