我们知道当实例化一个类时,也就是产生一个对象时需要分配内存空间.那一个对象具体需要多少字节的内存空间? 通过些什么规则计算出来的?
假如有如下一个类
------------------------------------------------------------------------------------------------------------------------------
类声明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++对象模型:理解与解析 #### C++对象模型概览 C++对象模型是C++编程语言中一个核心且复杂的概念,它定义了如何在内存中表示类、对象以及它们之间的关系。理解C++对象模型对于深入掌握C++语言特性、...
《侯捷讲座:C++对象模型》是一份深入解析C++内部对象模型的高质量学习资料。这份PDF高清版教程由知名C++专家侯捷主讲,旨在帮助开发者深入理解C++语言的核心机制,特别是对象模型的构建和运作原理。通过这份资源,...
C++对象内存布局 C++对象内存布局是指在C++编程语言中对象在内存中的存储结构和布局方式。了解C++对象的内存布局对于理解C++编程语言的对象模型和内存管理机制非常重要。 从内存布局的角度来看,C++对象可以分为三...
C++对象模型是C++编程的基础,它涉及到内存布局、虚函数、多态性、继承和封装等多个方面。首先,书中会详细讲解C++对象在内存中的表示方式,包括对象头、成员变量和成员函数的存储位置。理解这一部分对于优化内存...
这是一个关于C++对象模型的详细解释,涵盖了C++类继承内存布局、成员变量和成员函数的访问、虚继承、虚函数调用、强制转换到基类、异常处理等知识点。 首先,文章介绍了为什么需要了解C++对象模型,对于C++程序员来...
《深度探索C++对象模型》是侯捷翻译的一本关于C++对象模型深入探讨的专业书籍,原著作者为Stanley B. Lippman。这本书详细解析了C++中对象的内部表示、构造和析构的过程以及运行时行为等关键概念。它不仅仅是一本...
理解C++对象模型,特别是对象在内存中的布局,对于编写高效、可扩展的代码至关重要。C++对象模型包括两个主要方面:直接支持面向对象程序设计的部分,例如构造函数、析构函数、多态和虚函数等;以及底层实现机制,...
1. **C++对象模型**:C++对象模型是C++编程的基础,它描述了在C++程序中类和对象是如何在内存中存储和交互的。对象模型包括对象的生命周期、成员变量的布局、虚函数表、构造与析构过程、静态成员等内容。理解这一...
《深度探索C++对象模型》是一本专注于C++编程语言底层机制的专业书籍,它揭示了C++对象在内存中的表示方式以及对象模型的工作原理。这本书是面向已经对C++有一定基础理解的开发者,旨在帮助他们深入理解C++的内部...
C++对象模型首先涉及到的是内存管理,包括栈和堆上的对象创建与销毁。在栈上,对象的生命周期由其作用域决定,而堆上的对象需要程序员手动管理,这涉及到了指针的使用和智能指针(如`std::unique_ptr`和`std::shared...
1. C++对象模型概述:C++对象模型是C++语言在内存中的表示方式,它涉及到类、对象、成员变量、成员函数、继承、多态等核心概念。理解对象模型有助于优化代码、提高程序效率,并能有效避免潜在的内存问题。 2. 类与...
《深度探索C++对象模型》是一本面向C++高级开发者的经典著作,旨在揭示C++对象模型的内在机制和工作原理。这本书详细介绍了C++语言底层的实现细节,包括类、对象、继承、多态等核心概念在内存中的表示方式,以及...
C++对象模型是C++语言的基础,它涉及到类、对象、继承、多态、内存管理等核心概念的实现细节。这本书的中英文版本为读者提供了丰富的学习资源,无论你是初级程序员还是经验丰富的开发者,都能从中获益匪浅。 1. **...
《深度探索C++对象模型》这本书,由Stanley B. Lippman撰写,侯捷翻译,由华中科技大学出版社出版。本书致力于深入解析C++编译器在处理C++代码时所采取的复杂对象模型及其背后的底层机制,特别是针对构造函数、解构...
《深入理解C++对象模型》是一本专门为C++高级开发者准备的经典著作,旨在揭示C++对象模型的底层机制和工作原理。这本书英文版的出现,为那些具备良好英语阅读能力的程序员提供了深入学习C++核心概念的机会。CHM格式...
1. **C++对象模型**:C++对象模型是C++编程的基础,它描述了对象在内存中的布局,包括成员变量的位置、虚函数表、对象头信息等。理解对象模型有助于优化代码,尤其是在处理指针和引用时。 2. **内存管理**:C++不...
C++对象模型在内存中的实现,讲述了类,继承以及虚继承的内存布局;成员变量和成员函数的访问已经访问时的开销情况,包含虚函数的情况,考察构造函数,析构函数,以及特殊的赋值操作符成员函数是如何工作的,数组是...