指向对象的指针==指向第一个成员的指针?

时间:2010-11-29 21:03:04

标签: c++ pointers object member object-layout

为什么以下代码中的if条件产生为真?

struct A
{
    int firstMember;
} a1;

if (&a1 == static_cast<void*>(&a1.firstMember)) std::cout << "equal";

在空类上阅读Stroustrup's FAQ时,我有点困惑,特别是下面的语句:

if (p1 == p2) cout << "nice: good optimizer";

4 个答案:

答案 0 :(得分:18)

您的代码中没有涉及引用。不要将“address-of”运算符(也是&)与引用混淆。

您的条件返回true,因为在这种情况下,对象在内存中的第一个(也是唯一的)字段开始。就是这种情况,即所谓的POD(普通旧数据)对象,但并非总是如此。

例如,如果您的类包含任何虚函数,则该条件可能为false。不要依赖它。

答案 1 :(得分:1)

引用运算符发送回指向包含该成员的内存地址的指针。

这里,a1是一个只包含firstMember的类,所以内存中的结构只是那个元素:内存中a1的开头与firstMember的开头相同。

答案 2 :(得分:0)

引用的行为很像C ++中的指针。当您获取对变量的引用时,您要求该变量在内存中的位置。在这种情况下,您将a1中的第一条信息与a1本身进行比较。这是一个特殊情况,这将是有效的,而不是你应该依赖的东西。

答案 3 :(得分:0)

是的,你不能依赖它。特别是,在64位操作系统中,编译器可能会调整地址以考虑内存中的对齐。