C ++为什么sizeof包含对象实例的地址大小?

时间:2018-03-09 01:39:20

标签: c++ object instance sizeof

我只是想知道。如果创建一个没有数据的对象实例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字节的指针。它只在内存中创建数据。

1 个答案:

答案 0 :(得分:4)

  

根据我的理解,如果你创建一个A的实例,你创建一个64位的地址,数据紧跟在内存中的那个地址之后。

没有。如果您创建A的实例,则创建A的实例。那就是它。

然后该对象的地址会告诉您该对象的位置。如果你获得那个地址(用&,如图所示)并将其保存到指针中,那么指针变量本身会占用一些空间,当然。但除此之外,没有。

sizeof为您提供对象的大小。不是对象的大小,加上指针的大小。

不需要自动添加指针的大小。这实际上真的很烦人,因为你必须不断地减去它以让sizeof做一些有用的事情。

我无法想到一个用例,用一个数字来获取对象的组合大小和指向该对象的指针的大小。