为什么以下代码中的 if 条件为真?
struct A
{
int firstMember;
} a1;
if (&a1 == static_cast<void*>(&a1.firstMember)) std::cout << "equal";
在阅读Stroustrup关于空类的常见问题解答时,我有点困惑,特别是下面的声明:
if (p1 == p2) cout << "nice: good optimizer";
为什么以下代码中的 if 条件为真?
struct A
{
int firstMember;
} a1;
if (&a1 == static_cast<void*>(&a1.firstMember)) std::cout << "equal";
在阅读Stroustrup关于空类的常见问题解答时,我有点困惑,特别是下面的声明:
if (p1 == p2) cout << "nice: good optimizer";
您的代码中不涉及任何引用。不要将“地址”运算符(也&
)与引用混淆。
您的条件返回 true,因为在这种情况下,对象恰好在内存中与其第一个(也是唯一的)字段相同的位置开始。这就是所谓的POD(plain-old-data)对象的情况,但并不总是如此。
例如,如果您的类包含任何虚函数,则条件可能为假。不要依赖它。
引用运算符发回一个指向包含该成员的内存地址的指针。
这里,a1 是一个只包含 firstMember 的类,所以内存结构就是那个元素:内存中 a1 的开头与 firstMember 的开头相同。
引用的行为很像 C++ 中的指针。当您引用一个变量时,您是在询问该变量在内存中的位置。在这种情况下,您将 a1 中的第一条信息与 a1 本身进行比较。这是一个特定的情况,它会起作用,而不是你应该依赖的东西。
是的,你不能依赖它。特别是在 64 位操作系统中,编译器可能会调整地址以考虑内存对齐。