Welcome

首页 / 软件开发 / C++ / C++对象布局及多态实现探索之内存布局

C++对象布局及多态实现探索之内存布局2010-05-24为了便于分析和观察对象的内存布局,我把代码生成时的结构成员对齐选项设置为1字节,默认为8字节。如果你在自己的工程下编译文中的代码,请做同样的设置。因为我写了一些函数打印对象中的布局信息,如果对象选项不是1字节,运行这些代码会出现指针异常错误。

普通类对象的内存布局

首先我们从普通类对象的内存布局开始。c000为一个空类,定义如下:

struct c000

{};

运行如下代码打印它的大小及对象中的内容。

print_size_detail(c000)

结果为:

the size of c000 is 1

the detail of c000 is cc

可以看到它的大小为1字节,这是一个占位符。我们可以看到它的值是0xcc。在debug模式下,这表示是由编译器插入的调试代码所初始化的内存。在release模式下可能是个随机值,我测试时值为0x00。

定义两个类,c010和c011如下:

struct c010

{

c010() : c_(0x01) {}

void foo() { c_ = 0x02; }

char c_;

};

struct c011

{

c011() : c1_(0x02), c2_(0x03) {}

char c1_;

char c2_;

};

运行如下代码打印它们的大小及对象中的内容。

print_size_detail(c010)

print_size_detail(c012)

结果为:

the size of c010 is 1

the detail of c010 is 01

the size of c011 is 2

the detail of c011 is 02 03

我们从对象的内存输出中可以看到,它们的值就是我们在构造函数中赋的值,c010为0x01,c011为0x0203。大小分别为1、2。