gpt4 book ai didi

c++ - 类型转换和物体布局

转载 作者:太空宇宙 更新时间:2023-11-04 14:03:34 26 4
gpt4 key购买 nike

我试图通过转换以下两个不相关的类来理解对象的布局:

class A
{
public:
A(int x):_a(x){}

private:
int _a;
};

class B
{
public:
void Show()
{
cout << "&_x = " << &_x << "," << " _x = " << _x << endl;
cout << "&_y = " << &_y << "," << " _y = " << _y << endl;
cout << "&_z = " << &_z << "," << " _z = " << _z << endl;
}

private:
int _x, _y, _z;
};

要测试类,主要有以下代码:

int main()
{
A * pA = new A(5);
cout << pA << endl;
B * pB = (B *) pA;
pB->Show();
}

据我了解,

  • 调用会成功
  • B::_x 的值为 A::_a
  • 在运行时,尝试在 B::Show() 中访问 B::_y 和 B::_z 应该会崩溃,因为对象最初是类型 A 且大小为 4 字节,而编译器会期望 _y和 _z 从大小为 12 字节的 B 对象的起始地址偏移 4 和 8 字节。

实际上,虽然在 VS2010 中,在 Debug模式下,B::Show() 中的语句被打印出来,_y 和 _z 指向垃圾值,在 Release模式下,打印语句,_y 和 _z 指向垃圾值,然后出现崩溃(只是有时 :-()。

我原以为我们应该在尝试访问 _y 和 _z 时立即观察到崩溃,因为它们必须指向未分配的内存,但那并没有发生。我知道这种情况应该属于“未定义行为”的范畴,但对于这种行为的可能解释仍然是什么?

最佳答案

未定义行为的行为是未定义的。根据定义。

我们可以推测为什么程序会以不同的方式失败,但事实是它可能每天、每次运行或每次构建都会发生变化。

关于c++ - 类型转换和物体布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18078912/

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