2010-12-02 63 views
8

考慮我有一個Foo類(沒有它的&運算符重載)是從這個類的&運算符獲得的地址保證與它的this指針具有相同的值嗎?這是保證的C++值嗎?

在下面的代碼是equalPointer保證返回true? 有沒有可能返回錯誤的情況(例如,在考慮多重繼承時)?

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

回答

3

的問題是內存佈局之一。該標準不保證不多的內存佈局,尤其是它並不能保證沒有偏移派生和基類之間存在......

例如:

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

因爲boost::noncopyable沒有按」 t有一個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均具有虛擬方法)

+0

+1是的!!!另請參閱此問題http://stackoverflow.com/q/1742848/57428 – sharptooth 2010-12-03 08:04:13

2

隨着代碼的問題?是。

是否存在這樣的結構?也是。

但是,指向類X實例的指針總是等於類X中的'this'指針。對於其基類或派生類,不能這麼說。

+1

嗯。當函數被定義爲`template bool equalPointer(T const * f)`並被稱爲`f.equalPointer(&f)`時會發生什麼?現在`f ==這個`保證了嗎?不應該發生偏移校正,對吧? – 2010-12-02 21:52:02

2

是的。

f指針是一樣的,它被傳遞給f::equalPointer ...