C++中关于成员变量定义的位置有一些小的细节值得注意。对于写出高质量的代码有很大的帮助。主要只是点如下:
首先我们先回顾一些C++中各个变量在32位机子上所占内存的大小。
变量
字节数
变量
字节数
char
1
Pointer(指针)
4
bool
1
float
4
short
2
unsigned int
4
int
4
double
8
long
4
long long
8
类中变量定义的顺序就是真实内存中存储的位置。
Class Memory
{
int var1; // 4个字节
double var2; // 4个字节
char var3; // 1个字节
}如上图所示,变量定义的顺序决定了占用内存的大小。这就会有一个小细节需要注意了。因为不同的顺序会使得类所占内存大小会不一样。原因就是因为内存对齐。分配内存时机器都会以2的整数倍进行分配。如果不是2的整数倍就要进行对齐,即分配空闲内存使得变量申请的内存块大小是一致的。
如果定义变量的顺序是int、 double、char。 那么这个类的大小就是24个字节。因为var1和var3都需要进行补齐工作。但是如果改变一下顺序进行定义情况就会不一样。
class Memory
{
int var1; // 4个字节char var3; // 1个字节
double var2; // 4个字节
};
如果是这样去定义类成员变量时就要比第一版本节省8个字节。所以我们在以后的工作中写类。如何做到更好的规划成员变量定义顺序对于内存管理有着很大的关系。进行了第一阶段的学习之后我理解了对齐内容,当再深入的时候我发现了一个有趣的问题。有俩个定义顺序是我不能够理解的。
class X1 class X2
{ {
short s1 char c1;
char c1; short s1;
char c2; char c2;
int var; int var;
}; };
这俩个类的大小就是不一样的。通过仔细研究我发现。如果根据变量大小的排序。增序或者降序,这样才不会发生重新开辟新的空间。因为X1中变量s1、c1、c2大小是降序。加起来是4个字节和变量var正好相同,所以sizeof(x1) = 8, 而X2前三个变量大小排序不是有序列。所以c2又重新开辟了4个字节的内存块。这种情况只是针对几个变量大小相加正好等于要开辟的内存块。比如本例中4个字节。如果几个变量相加少于4个字节。怎么排序都是无所谓的。反正最后都是需要进行补齐操作的。
最后还有一个小的只是点就是类中另一个占内存的东东就是当类中有虚拟函数的时候就会多4个字节的额外内存。具体原因就是因为虚拟函数的运行机制决定的。会维护一个额外的虚拟表指针来,为了实现多态特性的。所以一个类的大小是由三个方面决定的。第一,肯定是由类中成员变量大小决定了。第二,也和成员变量的顺序有关系。第三,和是否有虚拟成员函数有关系。