曾經在一次面試中提到了這個問題,我覺得這裏值得總結一下。
在回答上述問題之前,我們先來回顧一下各自不同的數據類型佔多少之將字節。
那麼對於struct只用將所有類型所佔的空間累加,而union不同,它所佔的內存爲其中定義的單個最大的內存。
那麼我們可以很清楚的看出下面測試的答案
#include <iostream>
struct
{
char c;
int al;
short b;
}B;
union
{
int al;
char c;
short b;
}A;
int main()
{
using namespace std;
cout << sizeof(B) << endl;
cout << sizeof(A) << endl;
cin.get();
return 0;
}
很明顯答案應該爲7和4.
然而結果並非如此
why???
這裏涉及到CPU實現中的內存補齊機制,在CPU中有如下的基本優化規則:對於n字節的元素(n=2、4、8)它的首地址能被n整除,才能獲得最好的性能。
好像有點難以理解哦,爲了保證int的首地址能被四整除,實際上的內存是這樣的
因此纔會佔用12個字節的空間。
我們將結構體修改一下
struct
{
char c;
short b;
int al;
}B;
此時的儲存狀態爲
此時佔用的內存爲8字節。
有時候注意下結構體定義的數據的順序,也會提升一點速度,節約一點空間。類也是這樣的。