c++的内存对齐(memory alignment)注意点(1)



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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值