我只是想知道。如果创建一个没有数据的对象实例A,则类A的大小为1. C ++要求它至少为1个字节。这不是我的问题。
问题:
A的实例也有64位地址(如果是64位处理器)。为什么这个64位地址不包含在sizeof中?为什么8 + 1 = 9?
示例:
#include <iostream>
class A {};
union B
{
A a;
};
int main()
{
A a;
B b;
std::cout << "Size of A: " << sizeof(a) << " Size of B: " << sizeof(b) << std::endl;
std::cout << "Object A address: " << &a << " Size of Object A address: " << sizeof(&a) << std::endl;
}
输出:
Size of A: 1 Size of B: 1
Object A address: 0x759c4d77611f Size of Object A address: 8
根据我的理解,如果你创建一个A的实例,你创建一个64位的地址,数据紧跟在内存中的那个地址之后。
所以它看起来像:
[一个实例 - 分配了8个字节] [1个数据字节]
修改
这些家伙是完全正确的。我错了。创建的对象实例没有64位地址。数据本身就在内存中。
如果创建指向对象的指针,则会创建一个8字节的内存分配,但对象实例本身不会创建一个8字节的指针。它只在内存中创建数据。
答案 0 :(得分:4)
根据我的理解,如果你创建一个A的实例,你创建一个64位的地址,数据紧跟在内存中的那个地址之后。
没有。如果您创建A的实例,则创建A的实例。那就是它。
然后该对象的地址会告诉您该对象的位置。如果你获得那个地址(用&
,如图所示)并将其保存到指针中,那么指针变量本身会占用一些空间,当然。但除此之外,没有。
sizeof
为您提供对象的大小。不是对象的大小,加上指针的大小。
不需要自动添加指针的大小。这实际上真的很烦人,因为你必须不断地减去它以让sizeof
做一些有用的事情。
我无法想到一个用例,用一个数字来获取对象的组合大小和指向该对象的指针的大小。