class CA
{
public:
CA()
{
}
char c = 0;
int k = 0;
float valueF = 0.0;
virtual void trace()
{
}
double valueD = 0.0;
};
class CB : public CA
{
public:
CB()
{
}
int k = 0;
double valueD = 0.0;
};
struct StructA
{
char k = 0;
int k2 = 0;
double value = 0.0;
};
上述代码的这种形式导致的内存布局对大规模程序的稳定性和性能都造成了坏影响,这里特别提醒要注意要有意识的处理好内存对齐问题。上面的示例代码既浪费内存,又不利于cpu cache。(x86下)上面的 CA 实例占据32字节内存, 而CB占据48字节内存, StructA 实例占据16个字节的内存。特别要注意class 或者 struct实例占据的内存大小默认情况下是占据内存最大的成员变量的内存大小的倍数(除了静态成员以外), 因此要慎重考量这些变量的定义组合, 提高利用率
注意C++预处理指令 #pragma pack(n)中指定的n可以是1,2,4,8,16中的任意值,规定了class/struct实例占据的总内存大小。
如果n = 4,那么意味着,那么整个结构体就以4byte来进行内存对齐, 也就是内存大小是4的倍数。注意,即便你设置16,如果这类结构中的变量的最大内存占用为8,则依旧会依照8个字节来对其。一般情况下请使用默认值。以方便和其他系统或者模块整合。
看看下面这两个结构:
class CE
{
char c;
int i;
short s;
};
class StructE
{
char c;
int i;
short s;
};
这两个结构的实例所占据的内存都是12bytes
再看看下面这两个结构:
class CE
{
char c;
int i;
char s;
};
class StructE
{
char c;
int i;
char s;
};
注意,这两个结构的实例所占据的内存依旧都是12bytes