2014-03-19 37 views
6

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

一个例子结构为:

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

“..警告在哪里使用这个strcut”:你如何使用它? – deviantfan

+0

如何定义'_STRUCT'? –

+0

当我在'std :: list'或'std :: map'中使用struct时,会发生警告,例如'std :: list &aList;' – evotion

回答

2

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

...但核心问题似乎是不支持typedefs上的对齐。 属性((对齐))模板参数似乎根本没有任何影响。

来源: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; 

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

对于enum,struct或union类型,您既可以枚举,结构或联合标记和类型的名称之间,或刚刚过去的定义的右大括号指定的属性。前者的语法是首选。

因此,情况是,前者的实现设置了typedef的对齐方式,解决方案设置了结构的对齐方式,这是首要的目标。

3

这个貌似是按照C++ PATCH for c++/48138 (losing __attribute ((aligned)) on template argument)有目的的,它说:

...只是我们不想保留模板类型参数的属性,因为它们不是重整的一部分,所以你可以得到一个类模板实例化,它是同一类型的,不管参数的对齐如何,但是有效的参数取决于首次使用哪个对齐来实例化它。

当我们放弃属性时,PR建议发出警告,这很有道理。此修补程序在功能模板的情况下尚未提供警告,但对类模板也是如此。功能模板的警告将等到弥敦道补丁后,以提高模板过载诊断。

所以看起来警告是新的,但它处理的方式是一样的。

+0

也就是说,我也发现了什么,但是不明白声明是什么。在进一步搜索后,我发现了这个补丁的原始错误报告:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48138 基本的答案是:不要在typdefs中使用alignments,因为它没有任何效果,这是警告试图告诉我的。 – evotion