gpt4 book ai didi

c++ - 这个的 C++ 值有保证吗?

转载 作者:可可西里 更新时间:2023-11-01 17:52:36 26 4
gpt4 key购买 nike

考虑我有一个 Foo 类(没有重载其 & 运算符)从此类的 & 运算符获得的地址是否保证与其 this 指针具有相同的值?

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

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

最佳答案

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

例如:

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 都有虚方法时才有效)

关于c++ - 这个的 C++ 值有保证吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4340271/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com