【问题标题】:Compiling an aligned struct gives strange warning in GCC编译对齐的结构会在 GCC 中发出奇怪的警告
【发布时间】:2014-04-26 01:46:46
【问题描述】:

我们有多个 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]

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

【问题讨论】:

  • ".. 在使用此 strcut 的位置出现以下警告":您如何使用它?
  • _STRUCT是如何定义的?
  • 当我在 std::liststd::map 中使用结构时,会出现警告,例如std::list<STRUCT>& aList;
  • 从技术上讲,您不应该使用带有前导下划线的类型。那是一个保留的命名空间。如果您要让 ctor 成为定义的一部分,为什么不直接使用 class STRUCT

标签: c++ gcc struct g++ alignment


【解决方案1】:

根据C++ PATCH for c++/48138 (losing __attribute ((aligned)) on template argument),这看起来是有目的的,它说:

...除了我们不想在模板类型参数上保留属性,因为它们不是修饰的一部分,因此无论参数的对齐方式如何,您都可以获得相同类型的类模板实例化,但有效参数会根据首先用于实例化它的对齐方式而有所不同。

当我们删除属性时,PR 建议发出警告,这是有道理的。此补丁尚未针对函数模板提供警告,但针对类模板提供警告。函数模板的警告将等到 Nathan 的补丁改进模板重载诊断之后。

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

【讨论】:

  • 也就是我也找到了,但是没看懂语句是什么。经过进一步搜索,我找到了该补丁的原始错误报告:gcc.gnu.org/bugzilla/show_bug.cgi?id=48138 对此的基本答案是:不要在 typdefs 中使用对齐,因为它没有任何效果,这就是警告试图告诉我的.
【解决方案2】:

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

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

来源: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 类型,您可以在 enum、struct 或 union 标记与类型名称之间指定属性,也可以在定义的右大括号之后指定属性。首选前一种语法。

所以情况是,前一个实现为 typedef 设置对齐,解决方案为结构设置对齐,这是最初的目标。

【讨论】:

    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多