當前位置:首頁 » 編程語言 » c語言結構體位元組對齊

c語言結構體位元組對齊

發布時間: 2022-04-26 23:41:16

c語言結構體長度位元組對齊問題

因為當結構體中有多個數據類型時,結構體的長度對齊是按數據類型長度最長的那個來對齊的,double類型佔8個位元組,所以每個成員變數都按8個位元組的長度來算,就是5*8=40,驗證程序如下:

#include<stdio.h>
structchji
{
charname[9];
intnumber;
charsex;
doublescore;
floataa;
};
structchjistu;
intmain()
{
printf("sizeof(structchji)=%d ",sizeof(structchji));
return0;
}

運行結果:sizeof(struct chji)=40

如果要按單個位元組的長度來對齊的話,代碼如下:

#include<stdio.h>

#pragmapack(1)
structchji
{
charname[9];//9
intnumber;//4
charsex;//1
doublescore;//8
floataa;//4
};
structchjistu;
#pragmapack()

intmain()
{
printf("sizeof(structchji)=%d ",sizeof(structchji));
return0;
}

運行結果:sizeof(struct chji)=26

即9+4+1+8+4=26,你可以查下#pragma pack()相關的資料的,就會清楚了。

㈡ C語言結構體怎麼對齊按最大位元組對齊struct pp{int a;float b; doubl

24(按8位元組對齊,前面int和float合起來剛好8位元組+double8位元組+char補齊後8位元組=24)

如果是struct pp{int a;float b; char d}oo; sizeof(oo)就是12位元組,按4位元組對齊

㈢ c語言結構體對齊的問題。

這是個好問題!
為什麼會有對齊的問題呢?簡單的說就是為了提高訪問內存的效率,這和CPU內部的機制有關,如果你想深入理解,需要閱讀 Intel 開發者手冊。對齊採用的總體原則是這樣的:4位元組變數的存放要對齊到可以被4整除的地址上,8位元組變數的存放要對齊到可以被8整除的地址上。其他變數類推就行了。如果沒對齊編譯器就會將某個變數的存儲往後推遲幾個位元組,以保證對齊後再存放。
具體到這個問題就是可以先假設結構體變數從地址0處開始存放,那麼第一種情況就是這樣的了:
cat 存放的位置是地址0-地址3
a數組存放的位置是地址4-地址23
dog存放的位置是地址24到地址31
這里可以看到它們都符合對齊的原則(即每個變數開始存放的地址可以除盡它們所佔的位元組數),所以是32
第二種情況是這樣的:
cat仍然存放到地址0-地址3處
a數組是地址4到地址27處
存放dog時編譯器計算除下一個地址28並不能除盡double的位元組數8,於是它要將地址進行遞增。29,30,31仍然不能除盡8,知道遞增到32時可以將8除盡了,所以dog變數會被存放在地址32到地址39處,從地址0到地址39正好40個位元組,這就解釋了第二種情況了。

ps. 其實你這個問題還有一種變種就是一個結構體里在套一個結構體,這時會牽扯到內部的結構體對齊的問題。等你以後遇見了再給我提問吧,我給你解釋。

㈣ C語言裡面的位元組對齊的計算方法能講解1下嗎

首先你要知道為什麼會出現位元組對齊,這是一種用空間換時間的做法,因為對齊之後可以提高取數的效率。結構體的大小一般是4或者8的倍數,具體是以最大的變數類型的大小為基數的。也就是說在內存中,數據一般是放在一個4的整數倍的起始地址。
sturct S
{
char c;
short s;
int i;
}
它的大小是8個位元組,因為前面兩個佔了4位元組。如果寫成下面這種形式,它就是12位元組了
struct S
{
char c;
int i;
short s;
}
因為為了提高存取效率,所以第一個成員變數佔了四個位元組的空間,最後一個成員也佔了四個位元組

你非要說計算方法的話要根據具體情況來算了,首先看結構體中哪一個變數所佔的位元組數最大,然後後面的對齊計算都以這個為基數(我這里以4位元組為例)。接著,你把每一個成員變數的大小依次相加(按照結構體定義中的順序,從第一個加到最後一個)。當你加到某一個變數的時候,發現超過了4個位元組,那麼就把這個變數之前的內容當作是一個整體,它們一共點4個位元組,後面的再繼續這個過程

㈤ c語言,怎麼解決結構體位元組對齊問題或者說是否有一個函數能使未知結構體轉換成一位元組對齊的位元組數組

結構體中多定義一個無關的數據類型,這個數據類型的長度要和原有長度構成結構體的對齊

㈥ 關於C語言中的結構體位元組對齊

仔細看一下書中的說明吧,這三言兩語介紹起來有點累
或從網上查閱相關的技術資料,有詳細描述。
一般簡單來說,結構體從第一個變數開始檢查空間的「對齊位元組數」,
默認以第一個位元組大小作為對齊位元組數,如果遇上的下一個位元組與當前對齊位元組數不同時,就按兩者中較大的來進行結構體空間分配,接下來的對齊就全按此值來對齊,直到再遇上不同的才進行檢查或改變。

㈦ C語言里,聯合體要不要像結構體一樣對齊如果要,是幾的倍數

也要對齊。首先,聯合體要能容納其中最大的元素;然後,聯合體的對齊位元組數要跟內部元素的最大對齊位元組數一致。
例如,聯合體中含有以下幾個元素:
union
example
{
char
a;
int
b;
double
c;
struct
d
{
int
x;
int
y;
int
z;
};
};
1.
聯合體要能容納struct
d,因為d是12位元組,所以聯合體的大小要大於等於12。
2.
聯合體的對齊要以double
c為准,因為c是8位元組對齊的,最長。
所以最終,聯合體的大小是16個位元組。

㈧ C語言問題

這是結構體位元組對齊的問題!

struct student
{
int num; //佔4位元組
float score; //佔4位元組
char a; //佔1個位元組,為了讀取方便,後面補充了3個無效的位元組
struct student *aaa; //佔4個位元組
};

struct student
{
int num; //佔4位元組
float score; //佔4位元組
char a; //佔1個位元組,
char b; //佔1個位元組,為了讀取方便,後面補充了2個無效的位元組
struct student *aaa; //佔4個位元組
};

因此,加不加char b,他們佔用的位元組數量是一樣的

㈨ 在arm中c語言編程,定義的多位元組變數和結構體,最好使其為對齊存放."對齊存放"是

ARM支持16bit和32bit的地址訪問,即變數地址能夠被2或4整除,這時性能比較好,也便於移植。結構體的對齊就是指的結構體內部的每個成員變數地址盡可能對齊到2或4位元組位置,如定義為:
struct{
char ch1;
char ch2;
short ss;
int i;

}var;
字元變數ch1, ch2為位元組對齊,短整型變數ss為半字對齊,整型變數i為字對齊,結構體內的變數比較緊湊,且已自然對齊,結構體變數var佔用總空間為8個位元組。如果改為這樣:
struct{
char ch1;
short ss;
char ch2;
short ss;
int i;
}var;
var變數最終佔用的空間為12個位元組,存取這個結構體時比前面那個需要的時間要多,另外如果用pack(1)指定結構體位元組對齊的話,後面的方式移植到其它系統可能會出現死機問題。

熱點內容
緩存視頻合並工具最新版 發布:2025-05-16 09:35:03 瀏覽:193
花雨庭伺服器ip地址和埠 發布:2025-05-16 09:34:58 瀏覽:238
同時修改多台伺服器管理地址工具 發布:2025-05-16 09:20:36 瀏覽:421
什麼配置就能玩地平線 發布:2025-05-16 09:13:46 瀏覽:82
python旋轉圖片 發布:2025-05-16 09:13:40 瀏覽:638
少女前線防檢測腳本 發布:2025-05-16 08:59:07 瀏覽:728
編譯器對系統的依賴 發布:2025-05-16 08:37:29 瀏覽:711
javamap數組 發布:2025-05-16 08:37:28 瀏覽:451
移動光貓如何自行修改密碼 發布:2025-05-16 08:20:15 瀏覽:125
作為基線存儲 發布:2025-05-16 08:15:22 瀏覽:859