VS C 位元組對齊與記憶體投射

2021-10-12 07:04:14 字數 2031 閱讀 7172

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開始,...