c++ 之 内存模型:对象篇

Posted sxgloverr1314

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 之 内存模型:对象篇相关的知识,希望对你有一定的参考价值。

一、对象

 1.类对象所占用的空间

    (1)类的普通成员函数不占用类对象的成员空间

    (2)一个类对象至少要占用1字节的内存空间

    (3)类的普通成员变量占用类对象的空间(每一个类的对象拥有属于自己的成员变量)

    (4)类的普通成员函数虽然写在类的定义中,但普通成员函数不会占用类对象的内存空间

    (5)所有类的对象公用一份成员函数

 2.C++对象结构发展和演化

    (1)非静态的成员变量跟着对象走(存在于对象内部)(每一个类的对象拥有属于自己的成员变量)

    (2)静态成员变量所占用的内存空间于类对象无关,所有类对象公用一份静态成员变量。是归属于类本身的。

    (3)成员函数:不管静态还是非静态。全部保存在类对象之外。不占用具体的类对象的内存。

    (4)虚函数:类不管存在几个虚函数(>=1),会占用类对象内存的4个字节(和具体的机器相关)。(存储虚函数表地址)

         类中包含一个及以上的虚函数时,类会产生数量对应的指向虚函数的指针。这些指针存储一个表格里——虚函数表(virtual table [vtbl]),一般保存在可执行文件中,在程序执行时载入到内存里。

         虚函数表是基于类的。

         如果一个类包含虚函数,系统在类的对象中会添加一个指针指向该类的虚函数表,该指针被称为[vptr]。[vptr]的值是系统在适当的时机(比如构造函数中增加额外的代码实现)添加。

    (5)内存对齐:如果一个类有多个数据成员,那么为了提高访问速度,某些编译器可能会将数据成员之间的内存占用比例进行适当的调整。 

    (6)指针占用的内存大小:不管是什么类型的指针,指针在同一平台上的占用内存大小是一样的

指针大小是指针变量占用内存的大小(字节数).
在32位机上,所有指针类型变量占用内存字节数都为4
因为32位机就是 4字节 * 8个二进制位/字节 计算出来的.
如果在64位机上,指针占用内存大小就是:8个字节.

X86:32位(一般i386是32位CPU的统称)

X64:64位(代表CPU:IA64,现在几乎没有这样纯粹的64位CPU,都是兼容32位的64位CPU,如下)

X86_64:兼容32位的64位CPU,是64位(Intel的叫法)

AMD64:兼容32位的64位CPU,是64位(AMD的叫法)

 电脑处理器的位数,是表达了处理器的地址编码有多少个位。仅仅表达了寻址能力。
32位电脑,它告诉我们,地址有32个位,如果你想保存这个地址,需要使用32个位的空间来保存,就是4个字节。
double *x =a; //x这个变量的值,是一个地址。不管它指向什么类型的变量,地址只是一个变量存放的地址(指针)而已,地址是CPU统一编址的。CPU位数告诉你这个地址有多长。
cout<<sizeof(x)<<endl;输出CPU地址的编码长度,你是32位CPU,输出地址就是32位的,需要4个字节。因此sizeof输出4.

 

 

 

 

以上是关于c++ 之 内存模型:对象篇的主要内容,如果未能解决你的问题,请参考以下文章

转载图说C++对象模型:对象内存布局详解

java虚拟机之内存模型

c++对象模型是什么,对象的内存布局和结构问题

c++对象内存模型内存布局

JavaScript学习系列之内存模型篇

C++核心编程之-内存分区模型