【问题标题】:Is C++ value of this guaranteed?是否保证了 C++ 的价值?
【发布时间】:2011-05-19 10:09:50
【问题描述】:

假设我有一个类 Foo(它的 & 运算符没有重载)是从这个类的 & 运算符获得的地址保证与它的 this 指针具有相同的值吗?

在下面的代码中,equalPointer 是否保证返回 true? 是否有可能返回 false 的情况(例如,在考虑多重继承时)?

class Foo
{
  bool equalPointer(const Foo * f} { return f==this; }
}
Foo f;
f.equalPointer(&f);

【问题讨论】:

    标签: c++ this


    【解决方案1】:

    问题是内存布局之一。该标准并不能保证内存布局,特别是它不保证派生类和基类之间不存在偏移...

    例如:

    class Foo: public boost::noncopyable
    {
    public:
      virtual ~Foo();
    };
    

    因为boost::noncopyable没有virtual方法,在gcc中(void*)(Foo*)&f(void*)(boost::noncopyable*)&f会有不同的值。

    但这在实践中并不重要,因为编译器会执行必要的调整。也就是说,如果你只比较 Foo* 你应该没问题,花花公子......

    ...除了多重继承可能会破坏这一点,如果您的层次结构中有多个 Foo 子对象。

    另一方面,您应该处于以下两种情况之一:

    • 要么没有层次结构(没有虚拟),然后您可以按原样比较对象的地址
    • 或者存在层次结构(和虚拟方法),您使用dynamic_cast<void*>(&f) 获取完整对象的地址。

    因此,作为模板方法,这将给出:

    template <typename T, typename U>
    bool have_same_dynamic_location(T const& t, U const& u)
    {
      return dynamic_cast<void*>(&t) == dynamic_cast<void*>(&u);
    }
    

    (仅当 T 和 U 都有虚方法时才有效)

    【讨论】:

      【解决方案2】:

      有问题的代码?是的。

      是否存在不那么正确的构造?也可以。

      但是,是的,指向类 X 实例的指针总是等于类 X 中的“this”指针。不能说它的基类或派生类也是如此。

      【讨论】:

      • 嗯。当函数定义为template &lt;typename T&gt; bool equalPointer(T const* f) 并调用为f.equalPointer(&amp;f) 时会发生什么? f == this 现在有保障吗?那时不应该发生偏移校正,对吧?
      【解决方案3】:

      是的。

      f的指针是一样的,传给f::equalPointer...

      【讨论】:

        猜你喜欢
        • 2012-03-24
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-24
        • 1970-01-01
        相关资源
        最近更新 更多