[英]pointer to object == pointer to first member?
為什么以下代碼中的if條件產生true?
struct A
{
int firstMember;
} a1;
if (&a1 == static_cast<void*>(&a1.firstMember)) std::cout << "equal";
在閱讀關於空類的Stroustrup的FAQ時,我有些困惑,尤其是下面的語句:
if (p1 == p2) cout << "nice: good optimizer";
您的代碼中沒有引用。 不要將“ address-of”運算符(以及&
)與引用混淆。
您的條件返回true,因為在這種情況下,恰好該對象與它的第一個(也是唯一一個)字段在內存中的同一位置開始。 就是這種情況,即所謂的POD(普通數據)對象,但並非總是如此。
例如,如果您的類包含任何虛函數,則條件可能為假。 不要依賴它。
引用運算符將指針返回給包含該成員的內存地址。
在這里,a1是僅包含firstMember的類,因此內存中的結構就是該元素:內存中a1的開頭與firstMember的開頭相同。
引用的行為很像C ++中的指針。 當您引用一個變量時,您正在詢問該變量在內存中的位置。 在這種情況下,您正在將a1中的第一條信息與a1本身進行比較。 這是一個可行的特定情況,不是您應該依靠的東西。
是的,您不能依賴它。 特別是在64位OS中,編譯器可能會調整地址以解決內存中的對齊問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.