vs c++預設四位元組對齊,在新建資料結構的時候,如下新建兩個資料結構:
typedef struct struct_stream_bytestream_byte;
typedef struct struct_data_bytedata_byte;
此時如下新建兩個例項:
stream_byte* bytes=new stream_byte;
data_byte* datas=new data_byte;
siz
eof(
∗byt
es)=
size
of(∗
data
s)
?sizeof(*bytes)=sizeof(*datas)?
sizeof
(∗by
tes)
=siz
eof(
∗dat
as)?
一般人肯定會以為這兩個例項在空間裡所佔的記憶體是一樣的,還有人像這樣做字元投射:
stream_byte* b_stream=(stream_byte*)malloc(sizeof(stream_byte));
b_stream->byte1=0xbb;
memset(b_stream->s_precision,0x30,sizeof(b_stream->s_precision));
b_stream->ubyte1=0xbb;
memset(b_stream->d_byte,0x11,sizeof(b_stream->d_byte));
data_byte* m_pro=(data_byte*)b_stream;
char byte1_get=m_pro->byte1;
float s_precision_get=m_pro->s_precision;
unsigned char ubyte1_get=m_pro->ubyte1;
short d_byte_get=m_pro->d_byte;
這樣獲取的資料是正確的嗎?
按照直觀層面的意義,也就是我們理解的記憶體,肯定以為這樣是正確的,然後來進行操作,可是在visual studio環境下竟然取出了錯誤的資料,難道記憶體投射出問題了嗎?
其實不是這個樣子的,visual studio預設的是四位元組對齊,所以
s iz
eof(
∗byt
es)≠
size
of(∗
data
s)
sizeof(*bytes)≠sizeof(*datas)
sizeof
(∗by
tes)
=s
izeo
f(∗d
atas)si
zeof
(∗by
tes)
=7
sizeof(*bytes)=7
sizeof
(∗by
tes)
=7s iz
eof(
∗byt
es)=
12sizeof(*bytes)=12
sizeof
(∗by
tes)
=12此時應該加入如下**保證一位元組對齊
#ifdef win32
#pragma pack(1)
#ednif
此時才可以進行完美的記憶體投射
s iz
eof(
∗byt
es)=
size
of(∗
data
s)
sizeof(*bytes)=sizeof(*datas)
sizeof
(∗by
tes)
=siz
eof(
∗datas)
linux c 位元組對齊申請記憶體與位元組對齊陣列宣告
查詢當前系統cache line大小 cat sys devices system cpu cpu1 cache index0 coherency line size 函式 void memalign size t boundary,size t size 標頭檔案stdlib.h 函式memali...
記憶體位元組對齊
一 什麼是對齊,以及為什麼要對齊 1.現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。2.對齊的作...
記憶體位元組對齊
之前對記憶體位元組序知道一些,但是一直沒有系統的學習過,導致有時候還是說不清楚的,今天在網上查到一些自己,學習了下,並驗證了,特意給大家分享下,希望對大家能有幫助 總的來說就三條原則 在沒有 pragma pack巨集的時候 1 資料成員對齊規則,在結構體 struct 中,第乙個資料成員從0開始,...