1. 程式人生 > >C/C++ 面試-內存對齊 即不同數據類型存儲空間

C/C++ 面試-內存對齊 即不同數據類型存儲空間

blog 運行 windows display 出現 span 對齊 不同 ostream

下面列舉了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個字節
17 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
View Code

三個結構體 結構體中的數據都是一樣的 但是結構體所占的空間不一樣 這就是對齊機制對於存儲的影響

C/C++ 面試-內存對齊 即不同數據類型存儲空間