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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章