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++ 之 内存模型:对象篇的主要内容,如果未能解决你的问题,请参考以下文章