C/C++ 面試-內存對齊 即不同數據類型存儲空間
下面列舉了Dev-C++下基本類型所占位數和取值範圍:
基本型 所占位數 取值範圍 輸入符舉例 輸出符舉例
-- -- char 8 -2^7 ~ 2^7-1 %c %c、%d、%u
signed -- char 8 -2^7 ~ 2^7-1 %c %c、%d、%u
unsigned -- char 8 0 ~ 2^8-1 %c %c、%d、%u
[signed] short [int] 16 -2^15 ~ 2^15-1 %hd %hd
unsigned short [int] 16 0 ~ 2^16-1 %hu %hu、%ho、%hx
[signed] -- int 32 -2^31 ~ 2^31-1 %d
unsigned -- [int] 32 0 ~ 2^32-1 %u、%o、%x
[signed] long [int] 32 -2^31 ~ 2^31-1 %ld
unsigned long [int] 32 0 ~ 2^32-1 %lu、%lo、%lx
[signed] long long [int] 64 -2^63 ~ 2^63-1 %I64d
unsigned long long [int] 64 0 ~ 2^64-1 %I64u、%I64o、%I64x
-- -- float 32 +/- 3.40282e+038 %f、%e、%g
-- -- double 64 +/- 1.79769e+308 %lf、%le、%lg %f、%e、%g
-- long double 96 +/- 1.79769e+308 %Lf、%Le、%Lg
註意:int型數據 在不同位數的系統中 所占位數不一樣 一些編譯器不同也有影響
16 2*8位
32 4*8位
64 8*8位
1 BYTE=8 BIT
內存對齊可以用一句話來概括:
“數據項只能存儲在地址是數據項大小的整數倍的內存位置上”
例如int類型占用4個字節,地址只能在0,4,8等位置上。
double類型占用8個字節,地址只能在0,8,16等位置上面
如果代碼之中有特別規定的話 對齊方式以程序為主
#pragma pack(n)
如果在代碼之中出現了上面的語句
那麽對齊機制 為地址只能在0,n,2*n,3*n等位置上面
1 #include <iostream> 2 #include <cstdlib> 3 #include <pthread.h> 4 #include <windows.h> 5 using namespace std; 6 struct X1 7 { 8 int i;//4個字節 9 char c1;//1個字節 10 char c2;//1個字節 11 long a;//4個字節 12 float b; 13 } x1; 14 struct X2 15 { 16 char c1;//1個字節View Code17 int i;//4個字節 18 char c2;//1個字節 19 long a;//4個字節 20 float b; 21 } x2; 22 struct X3 23 { 24 char c1;//1個字節 25 char c2;//1個字節 26 int i;//4個字節 27 long a;//4個字節 28 float b; 29 } x3; 30 struct X4 31 { 32 int i;//4個字節 33 char c1;//1個字節 34 char c2;//1個字節 35 long a;//4個字節 36 float b; 37 } x4; 38 int main() 39 { 40 cout<<"long "<<sizeof(long)<<"\n"; 41 cout<<"float "<<sizeof(float)<<"\n"; 42 cout<<"int "<<sizeof(int)<<"\n"; 43 cout<<"char "<<sizeof(char)<<"\n"; 44 cout<<"x1 的大小 "<<sizeof(x1)<<"\n"; 45 cout<<"x2 的大小 "<<sizeof(x2)<<"\n"; 46 cout<<"x3 的大小 "<<sizeof(x3)<<"\n"; 47 cout<<"x4 的大小 "<<sizeof(x4)<<"\n"; 48 return 0; 49 } 50 運行結果: 51 long 4 52 float 4 53 int 4 54 char 1 55 x1 的大小 16 56 x2 的大小 20 57 x3 的大小 16 58 x4 的大小 16
三個結構體 結構體中的數據都是一樣的 但是結構體所占的空間不一樣 這就是對齊機制對於存儲的影響
C/C++ 面試-內存對齊 即不同數據類型存儲空間