C++中struct的空間計算
一般使用sizeof判斷struct所佔的位元組數,那麼計算規則是什麼呢?
關鍵詞:
1.變數的起始地址和變數自身的位元組數
2.以最大變數位元組數進行位元組對齊(倍數關係)。
注:這裡介紹的原則都是在沒有#pragma pack巨集的情況下
先舉個例子:
struct A
{
char a[5];
int b;
short int c;
}struct A;
在上例中,要計算 sizeof(a) 是多少?
有兩個原則:
1)各成員變數存放的起始地址相對於結構的起始地址的偏移量必須為該變數的型別所佔用的位元組數的倍數 即當 A中的a佔用了5個位元組後,b需要佔用四個位元組,此時如果b直接放在a後,則b的起始地址是5,不是sizeof(int)的整數倍,所以 需要在a後面補充3個空位元組,使得b的起始地址為8. 當放完b後,總空間為5+3+4 = 12. 接著放c,此時為 12 + 2 = 14.
2)為了確保結構的大小為結構的位元組邊界數(即該結構中佔用最大空間的型別所佔用的位元組數)的倍數, 所以在為最後一個成員變數申請空間後,還會根據需要自動填充空缺的位元組。 這是說A中佔用最大空間的型別,就是int型了,佔用了4個位元組,那麼規定A佔用的空間必須是4的整數倍。本來計算出來佔用的空間為14, 不是4的整數倍,因此需要在最後補充2個位元組。最終導致A佔用的空間為16個位元組。
再舉個例子:
struct B
{
char *d;
short int e;
long long f;
char c[1];
}b;
void test2() {
printf("%d\n", sizeof(b));
}
對於此題,需要注意的一點是:windows系統對long long是按照8位元組進行對齊的,但是Linux系統對long long則是按照4位元組對齊的。
因此: d佔用4位元組(因為d是指標)
e佔用2位元組
f佔用8位元組,但是其起始地址為為6,不是4的整數倍(對於Linux系統),或不是8的整數倍(對於Windows系統),因此對e之後進行位元組補齊,在這裡不管對於Linux還是Windows都是補充2個位元組,因此 f 的起始地址是8,佔用8個位元組。
對於c,它佔用了1個位元組,起始地址是16,也是1的整數倍。
最後,在c之後需要對整個B結構體佔用的空間進行補齊,目前佔用空間是16+1 = 17個位元組。
對於Linux,按4位元組補齊(long long 是按4位元組補齊的),因此補充了3位空位元組,最後佔用空間是 17 + 3 = 20位元組。
對於Windows系統,是按8位元組補齊的,因此就補充了7個位元組,最後佔用的空間是24位元組。
相關文章
- ifccolumn在空間中的座標計算
- 【scipy 基礎】--空間計算
- C和C++中的名字空間和作用域C++
- C++名稱空間C++
- 【財富空間】計算機起源的數學思想計算機
- 在C++中申請堆區空間與在C中申請堆區空間的異同點C++
- 從中國造像空間聊聊遊戲空間設計中的一些設計小技巧遊戲
- 三維空間中物體兩次旋轉之間的連續旋轉矩陣計算矩陣
- c++系列:匿名名稱空間C++
- 說說你對演算法中時間複雜度,空間複雜度的理解?如何計算?演算法時間複雜度
- (資料科學學習手札84)基於geopandas的空間資料分析——空間計算篇(上)資料科學
- (資料科學學習手札88)基於geopandas的空間資料分析——空間計算篇(下)資料科學
- 緊空間中的網
- 一文講透演算法中的時間複雜度和空間複雜度計算方式演算法時間複雜度
- C++系列: 巢狀名稱空間C++巢狀
- struct結構體大小的計算(記憶體對齊)Struct結構體記憶體
- 從作業系統角度看錶空間計算方式作業系統
- HSV顏色空間下的圖片相似性計算(python版)Python
- C時間函式strftime、struct timespec 和 struct timeval函式Struct
- 空間度量:深度探究FPS關卡中的元素設計
- 單像空間後方交會計算旋轉矩陣矩陣
- Java中計算兩個日期間的天數Java
- spring框架中的名稱空間Spring框架
- Numpy 高維空間中的軸
- MySQL 中的共享表空間與獨立表空間如何選擇MySql
- AI賦能網路空間安全 • 綠盟科技亮相2019中國計算機大會AI計算機
- 如何理解神經網路空間,深度學習在計算機視覺中的應用有哪些?神經網路深度學習計算機視覺
- C++基礎(八)struct和class的區別C++Struct
- 計算地圖中兩點之間的距離地圖
- Java 中,如何計算兩個日期之間的差距?Java
- 【TUNE_ORACLE】檢視Oracle的壞塊在空閒空間中還是在已用空間中的SQL參考OracleSQL
- C++尺寸大小計算C++
- 空間統計(二)分析模式 A模式
- js計算線性漸變的中間顏色值JS
- java中的時間運算Java
- C/C++ 中的算術及其陷阱C++
- 空間計算、物理計算、實時模擬與創造擁有「自主行為」的小狗 | 播客《編碼人聲》
- 世界空間到觀察空間的矩陣矩陣