`
lovnet
  • 浏览: 6881146 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

C++对象模型(1):对象内存布局简介

 
阅读更多

我们知道当实例化一个类时,也就是产生一个对象时需要分配内存空间.那一个对象具体需要多少字节的内存空间? 通过些什么规则计算出来的?

假如有如下一个类

------------------------------------------------------------------------------------------------------------------------------

类声明Arwen.h

class Arwen

{

public:

Arwen(void);

virtual ~Arwen(void);

int Age();

staticvoid Height(int);

private:

int m_nAge;

staticint s_nHeight;

};

----------------------------------------------------------------------------------------------------------------------------------

类源文件Arwen.cpp

#include "Arwen.h"

int Arwen::s_nHeight = 1; //记得初始化静态变量

Arwen::Arwen(void){ }

Arwen::~Arwen(void){ }

int Arwen::Age ()

{

return m_nAge;

}

void Arwen::Height(int a)

{

s_nHeight = a;

}

-----------------------------------------------------------------------------------------------------------------------

假如实例化上面这样一个类,在内存中是怎么样分配空间的呢?

我们知道一个类包括成数据成员(data members)和成员函数(member functions).

数据成员分为static 和 nonstatic

成员函数分为static , nonstatic, virtual

数据成员内存分配

static变量是在静态存储区(有人也叫数据段)分配空间.而nonstatic变量则在对象中分配空间.

所以static int s_nHeight;是在静态存储区分配空间,不在对象空间的计算之内.int m_nAge;就需要4字节空间

成员函数内存分配

static和nonstatic成员函数都是在代码区(或者叫文本段)中分配内存.也不在对象内容的计算之内.

virtual成员函数(不管多少个),都只都只会在对象中插入一个指针,指向一个virtual table(这是保存在哪个地方?还没搞懂),virtual table里面保存着一堆指针,一个指针是指向类型信息,其他的都指向虚函数的地址.虚函数本身跟static和nonstatic成员函数一样是保存在代码区.

由于类Arwen中有虚函数,所有编译器会自动插入一个指针指向virtual table,指针在32位系统上是4位.

所以实例化类Arwen需要分配8字节的内存空间.int m_nAge的4字节,加上指向虚表的指针4字节.

你可以用sizeof(Arwen)计算下就会发现结果是8.

不过其实有时一些特殊情况会结果未必就是这样计算出来的值.例如一个类没有任何数据成员和虚成员函数,理就为0,但sizeof发现会是1,这是因为在内存中好歹要用点啥来唯一标志一个类.另外有时计算出来的值是7或其他啥不是2的整数倍,由于有个啥内存对象的机制(可能又会按成员数据对齐,整体对齐),最终sizeof的结果可能不太一样.

内存对齐详见:http://baike.baidu.com/view/4786260.htm

分享到:
评论

相关推荐

    深度探索C++对象模型.pdf

    ### 深度探索C++对象模型:理解与解析 #### C++对象模型概览 C++对象模型是C++编程语言中一个核心且复杂的概念,它定义了如何在内存中表示类、对象以及它们之间的关系。理解C++对象模型对于深入掌握C++语言特性、...

    侯捷讲座:C++对象模型(PDF高清).rar

    《侯捷讲座:C++对象模型》是一份深入解析C++内部对象模型的高质量学习资料。这份PDF高清版教程由知名C++专家侯捷主讲,旨在帮助开发者深入理解C++语言的核心机制,特别是对象模型的构建和运作原理。通过这份资源,...

    C++对象内存布局[归类].pdf

    C++对象内存布局 C++对象内存布局是指在C++编程语言中对象在内存中的存储结构和布局方式。了解C++对象的内存布局对于理解C++编程语言的对象模型和内存管理机制非常重要。 从内存布局的角度来看,C++对象可以分为三...

    深度探索C++对象模型 PDF

    C++对象模型是C++编程的基础,它涉及到内存布局、虚函数、多态性、继承和封装等多个方面。首先,书中会详细讲解C++对象在内存中的表示方式,包括对象头、成员变量和成员函数的存储位置。理解这一部分对于优化内存...

    C++对象模型详解[收集].pdf

    这是一个关于C++对象模型的详细解释,涵盖了C++类继承内存布局、成员变量和成员函数的访问、虚继承、虚函数调用、强制转换到基类、异常处理等知识点。 首先,文章介绍了为什么需要了解C++对象模型,对于C++程序员来...

    深度探索C++对象模型(侯捷 著)

    《深度探索C++对象模型》是侯捷翻译的一本关于C++对象模型深入探讨的专业书籍,原著作者为Stanley B. Lippman。这本书详细解析了C++中对象的内部表示、构造和析构的过程以及运行时行为等关键概念。它不仅仅是一本...

    图说C++对象模型.pdf

    理解C++对象模型,特别是对象在内存中的布局,对于编写高效、可扩展的代码至关重要。C++对象模型包括两个主要方面:直接支持面向对象程序设计的部分,例如构造函数、析构函数、多态和虚函数等;以及底层实现机制,...

    深入探索c++对象模型

    1. **C++对象模型**:C++对象模型是C++编程的基础,它描述了在C++程序中类和对象是如何在内存中存储和交互的。对象模型包括对象的生命周期、成员变量的布局、虚函数表、构造与析构过程、静态成员等内容。理解这一...

    深度探索C++对象模型

    《深度探索C++对象模型》是一本专注于C++编程语言底层机制的专业书籍,它揭示了C++对象在内存中的表示方式以及对象模型的工作原理。这本书是面向已经对C++有一定基础理解的开发者,旨在帮助他们深入理解C++的内部...

    深度探索C++对象模型 PDF中文清晰版

    C++对象模型首先涉及到的是内存管理,包括栈和堆上的对象创建与销毁。在栈上,对象的生命周期由其作用域决定,而堆上的对象需要程序员手动管理,这涉及到了指针的使用和智能指针(如`std::unique_ptr`和`std::shared...

    深度探索C++对象模型(清晰版).rar

    1. C++对象模型概述:C++对象模型是C++语言在内存中的表示方式,它涉及到类、对象、成员变量、成员函数、继承、多态等核心概念。理解对象模型有助于优化代码、提高程序效率,并能有效避免潜在的内存问题。 2. 类与...

    深度探索C++对象模型- pdf,1积分下载

    《深度探索C++对象模型》是一本面向C++高级开发者的经典著作,旨在揭示C++对象模型的内在机制和工作原理。这本书详细介绍了C++语言底层的实现细节,包括类、对象、继承、多态等核心概念在内存中的表示方式,以及...

    深度探索C++对象模型_中英

    C++对象模型是C++语言的基础,它涉及到类、对象、继承、多态、内存管理等核心概念的实现细节。这本书的中英文版本为读者提供了丰富的学习资源,无论你是初级程序员还是经验丰富的开发者,都能从中获益匪浅。 1. **...

    C++对象模型.pdf

    《深度探索C++对象模型》这本书,由Stanley B. Lippman撰写,侯捷翻译,由华中科技大学出版社出版。本书致力于深入解析C++编译器在处理C++代码时所采取的复杂对象模型及其背后的底层机制,特别是针对构造函数、解构...

    深入理解C++对象模型

    《深入理解C++对象模型》是一本专门为C++高级开发者准备的经典著作,旨在揭示C++对象模型的底层机制和工作原理。这本书英文版的出现,为那些具备良好英语阅读能力的程序员提供了深入学习C++核心概念的机会。CHM格式...

    深度探索C++对象模型(中英文版)

    1. **C++对象模型**:C++对象模型是C++编程的基础,它描述了对象在内存中的布局,包括成员变量的位置、虚函数表、对象头信息等。理解对象模型有助于优化代码,尤其是在处理指针和引用时。 2. **内存管理**:C++不...

    C++对象模型在内存中的实现

    C++对象模型在内存中的实现,讲述了类,继承以及虚继承的内存布局;成员变量和成员函数的访问已经访问时的开销情况,包含虚函数的情况,考察构造函数,析构函数,以及特殊的赋值操作符成员函数是如何工作的,数组是...

Global site tag (gtag.js) - Google Analytics