C語言 關於位元組對齊的問題

2021-08-27 06:29:38 字數 899 閱讀 7896

由於基礎不夠紮實,前幾天在工作中踩了乙個坑,實在忍不了了,寫個部落格記錄一下。

一、位元組對齊的概念

記憶體空間是按照位元組劃分的,從理論上來講對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問。這就需要各種型別的資料按照一定的規章在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。

對齊跟資料在記憶體中的位置有關,如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱作自然對齊。如32位cpu下,假設乙個整型變數的位址為0x00000004,它就自然對齊的。 

二、位元組對齊的必要性

各個硬體平台對儲存空間的處理有很大不同,如果不按照合適其平台要求對資料存放進行對齊,會在訪問效率上帶來損失。

例如:假設上面整型變數的位址是0x00000006,則cpu需訪問兩次記憶體才能取到值。第一次取0x00000006-0x00000007的乙個short,第二次取0x00000008-0x00000009的乙個short,然後組合成int。如果變數在0x00000007位址的話,則要訪問三次記憶體,第一次為char,第二次為short,第三次為char,然後組合成int。而如果變數在自然對齊的位置上,則只要一次就可以取出資料。

三、我遇到的位元組對齊問題

typedef _reqreq;

req r;

sizeof(r)的值是幾?不是5!是8!結構體中每個資料型別都要求對齊!預設是按照4個位元組儲存,所以char在儲存的時候填充3個位元組,使整個結構體對齊。

但是在ruby中是採用位元組緊縮的方式儲存變數,即sizeof(r)的值的5!

這會導致如果用ruby指令碼構造請求,和c語言的可執行程式進行網路互動時,請求字段總是因為長度不匹配導致不會被正確解析。而莫名「丟失」的位元組在程式列印的日誌中又很難追查。曾經被這個小白問題卡住了,記錄一下。

關於c語言中的位元組對齊padding問題

最近的工作中,發現有乙個很奇怪的問題,就是兩個結構體,裡面的字段的值完全是一樣的,但是用memcpy就是不返回0。大致是下面的 輸出是 aa bb bb cc 為什麼設的值都是一樣的,但是memcmp就是返回不一樣呢。memcpy還算是乙個比較常用的函式,特別是在c語言中比較乙個有較多字段的結構體,...

c語言位元組對齊問題(一)

在這裡只總結結構體的位元組對齊問題,看下面的結構體 struct s1 char a int b short c struct s2 char a short c int b 那麼sizeof s1 12,sizeof s1 8 我們可以假定結構體在記憶體中的位址是0x0000開始的,那麼我們說的位...

c語言位元組對齊問題(二)

struct s 那麼sizeof s 4 先說下位域在記憶體對齊的一些規則 2.位域的多少定義多少就後面接多少位,但是位域要求是連續的位元組,像a已經占有4位了,乙個位元組8位,那麼就會填補4位,到下個位元組,所以到b變數占用的是另個一新位元組。3.對於一些資料說位域不能跨兩個位元組,就是說位域長...