【问题标题】:boost::bind breaks strict-aliasing rules?boost::bind 打破了严格的别名规则?
【发布时间】:2011-03-03 19:09:12
【问题描述】:

使用 Boost 1.43 和 GCC 4.4.3,以下代码

boost::bind(&SomeObject::memberFunc, this, _1));

产生以下警告

升压/功能/function_base.hpp:321: 警告:取消引用类型双关语 指针将破坏严格混叠 规则

在不设置 -fno-strict-aliasing 的情况下消除这些警告的正确方法是什么?

【问题讨论】:

  • Boost 并非旨在或设计为不对所有编译器产生警告。这很可能是使用 boost::bind 的副作用。无论如何,-fno-strict-aliasing 的性能提升是微不足道的。

标签: c++ boost-bind strict-aliasing


【解决方案1】:

你确定你有正确的对象与成员函数 foo 所在的类匹配吗?换句话说,在您发布的代码中,*this 的类型是否与 SomeObject 相同?当编译器必须跟踪指向同一原始数据的多个不同类型的指针时,就会出现别名,这就是为什么我怀疑 *this 和 SomeObject 的类型不一样。

【讨论】:

  • 你是唯一的答案。恭喜你,你赢了。 (不过 *this 和 SomeObject 的类型是一样的。)
  • @Kyle ...这不是接受答案的方式。特别是当(A)这个答案可能只是一个评论,(B)它忽略了bind几乎肯定使用template参数匹配来要求兼容(别名)指向方法和指针的事实无论如何,实例参数,这意味着问题将是函数内部的错误,并且(C)您公开承认它不能解决您的问题中提出的问题。所以不要将其标记为答案!这里的另一个答案确实解释了它。
【解决方案2】:

为了记录,我对使用 GCC 4.4.3 for Google 的 Native Client 的 boost::bind 有同样的警告。将 boost 从 1.41.0 升级到 1.47.0 后,警告消失了。

【讨论】:

    猜你喜欢
    • 2019-05-14
    • 1970-01-01
    • 2015-10-15
    • 2017-02-25
    • 2020-04-11
    • 2015-01-16
    • 1970-01-01
    相关资源
    最近更新 更多