當前位置:首頁 » 編程軟體 » 位元組對齊編譯器

位元組對齊編譯器

發布時間: 2022-07-11 09:00:34

編譯器位元組對齊對針指參數有關嗎

非main函數裡面分配的局部變數時候是 以四位元組對齊的

Ⅱ 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語言位元組對齊怎麼操作

成為一名合格的IT人才

Ⅳ 結構體成員的位元組對齊

這個問題都很有深度啊;

首先我要說的是,位元組對齊在不同編譯器下語法是不一樣的,在GCC中是#pragma push(1) #pragma pack(); 在MS C++中用VC的代碼項里可以調整,默認是8位元組;

typedef struct
{
char c;
int i;
}test;

位元組對齊,是對齊,比如說char 與 int 如果是4位元組對齊,那麼char也會佔用4個位元組,總共佔8位元組,而且結構體對象存儲是按照順序存的,char 肯定在int前面。第二種情況如果1位元組對齊,意味著char只佔1位元組,而結下來int會佔用4位元組,這個N位元組對齊的意思是,每個成員佔用空間必須是N位元組的倍數,不足N位元組的佔用N位元組。那麼以1位元組對齊那它佔用5個位元組。

還有你說的每種數據是低位還是高位在前,這個根處理器有關,Intel處理是小端對齊,比如說一個整數522387969用16進製表示是:0x1f 23 02 01,在Intel處理器中表示是0x01 02 23 1f,所以在內存用0x01 02 03 1f來示522387969,這就是所謂有小端對齊;但在arm處理器中522387969表示是0x1f 23 02 01,這就是所謂的大端對齊,這種方式又叫作網路位元組序。

當然前面說的位元組序只是對int long short這些內置(built in)數據類型用效,對結構體內如果有int long這類成員也會有所謂的位元組序,如前面所說,不管是什麼序結構體對象存儲是按照順序存,先定義的成員肯定在後定義的成員前面,但單個成員有位元組序,不知這樣說,你的明白?

不是,請仔細體會這句話:這個N位元組對齊的意思是,每個成員佔用空間必須是N位元組的倍數,不足N位元組的佔用N位元組。

大於N位元組就湊夠N位元組的倍數,比如按3位元組對齊,那麼一個4位元組的int將占據6位元組~

Ⅳ keil編譯器中如何使代碼位元組對齊

tab 鍵縮進,可以設置自動縮進,寫得代碼好看,有靠你自己!

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

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

Ⅶ 簡述什麼叫做位元組對齊,編程時使用什麼方式在代碼中說

什麼是位元組對齊:

位元組(Byte)是計算機信息技術用於計量存儲容量和傳輸容量的一種計量單位,一個位元組等於8位二進制數,在UTF-8編碼中,一個英文字元等於一個位元組。

位元組按照一定規則在空間上排列就是位元組對齊。

解釋

現代計算機中內存空間都是按照byte劃分的,從理論上講似乎對任何類型的變數的訪問可以從任何地址開始,但實際情況是在訪問特定類型變數的時候經常在特 定的內存地址訪問,這就需要各種類型數據按照一定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。

作用和原因:

各個硬體平台對存儲空間的處理上有很大的不同。一些平台對某些特定類型的數據只能從某些特定地址開始存取。比如有些架構的CPU在訪問 一個沒有進行對齊的變數的時候會發生錯誤,那麼在這種架構下編程必須保證位元組對齊。其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台要求對 數據存放進行對齊,會在存取效率上帶來損失。

比如有些平台每次讀都是從偶地址開始,如果一個int型(假設為32位系統)如果存放在偶地址開始的地方,那麼一個讀周期就可以讀出這32bit,而如果存放在奇地址開始的地方,就需要2個讀周期,並對兩次讀出的結果的高低位元組進行拼湊才能得到該32bit數據。

准則:

其實位元組對齊的細節和具體編譯器實現相關,但一般而言,滿足三個准則:

1) 結構體變數的首地址能夠被其最寬基本類型成員的大小所整除;

2) 結構體每個成員相對於結構體首地址的偏移量都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組;例如上面第二個結構體變數的地址空間。

3) 結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充位元組。

概念與規則:

四個基本概念

1.數據類型自身的對齊值:對於char型數據,其自身對齊值為1,對於short型為2,對於int,float類型,其自身對齊值為4,對於double型,其自身對齊值為8,單位位元組。

2.結構體或者類的自身對齊值:其成員中自身對齊值最大的那個值。

3.指定對齊值:#pragma pack (value)時的指定對齊值value。

4.數據成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中小的那個值。對齊規則有效對齊值N是最終用來決定數據存放地址方式的值,最重要。有效對齊N,就是表示「對齊在N上」,也就是說該數據的"存放起始地址%N=0".而數據結構中的數據變數都是按定義的先後順序來排放的。第一個數據變數的起始地址就是數據結構的起始地址。結構體的成員變數要對齊排放,結構體本身也要根據自身的有效對齊值圓整。

Ⅷ C語言位元組對齊問題

目前編譯器上(我是說visual c++)如果沒有特別設置的話, 默認的對齊方式按下面幾個規律
1. 每個成員對齊到它長度的整數倍
2. 整個結構的長度對齊到它最長成員長度的整數倍
3. 上面所說的長度,超過4的按4算。
就這個來說, b欄位會被對齊到2位元組位置, 最後整個會被對齊到6位元組長
我不知道這幾點是標准還是實現, 以後會不會有變化

Ⅸ 求助關於C語言結構體對齊的問題

在結構中,編譯器為結構的每個成員按其自然對界(alignment)條件分
配空間。

double b的是該結構所有成員中要求的最大對界單元;
因此why結構的自然對界條件為8位元組;

題目的意思是要按照8位元組對齊來計算;
int a;//需要補充四個空位元組;
double b;//8個位元組
char c[16];//16個位元組
所以是8+8+16;

如果通過編譯器執行的話,編譯器會按照自己的規則來進行位元組的對齊;
可以通過#pragma pack(8)調整編譯器按照8位元組對齊
但是當#pragma pack的n值等於或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果。

所以,即使#pragma pack(8),編譯器的執行結果仍然是28

作為試題的話,主要是要讓你理解內存對齊,給出答案32即可

Ⅹ c++中內存是如何對齊的

有虛函數的話就有虛表,虛表保存虛函數地址,一個地址佔用的長度根據編譯器不同有可能不同,vs裡面是8個位元組,在devc++裡面是4個位元組。類和結構體的對齊方式相同,有兩條規則
1、數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0的地方,以後每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。
2、結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行

下面是我收集的關於內存對齊的一篇很好的文章:

在最近的項目中,我們涉及到了「內存對齊」技術。對於大部分程序員來說,「內存對齊」對他們來說都應該是「透明的」。「內存對齊」應該是編譯器的 「管轄范圍」。編譯器為程序中的每個「數據單元」安排在適當的位置上。但是C語言的一個特點就是太靈活,太強大,它允許你干預「內存對齊」。如果你想了解更加底層的秘密,「內存對齊」對你就不應該再透明了。

一、內存對齊的原因
大部分的參考資料都是如是說的:
1、平台原因(移植原因):不是所有的硬體平台都能訪問任意地址上的任意數據的;某些硬體平台只能在某些地址處取某些特定類型的數據,否則拋出硬體異常。
2、性能原因:數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。

二、對齊規則
每個特定平台上的編譯器都有自己的默認「對齊系數」(也叫對齊模數)。程序員可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數,其中的n就是你要指定的「對齊系數」。

規則:
1、數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0的地方,以後每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。
2、結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行。
3、結合1、2顆推斷:當#pragma pack的n值等於或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果。

三、試驗
我們通過一系列例子的詳細說明來證明這個規則吧!
我試驗用的編譯器包括GCC 3.4.2和VC6.0的C編譯器,平台為Windows XP + Sp2。

我們將用典型的struct對齊來說明。首先我們定義一個struct:
#pragma pack(n) /* n = 1, 2, 4, 8, 16 */
struct test_t {
int a;
char b;
short c;
char d;
};
#pragma pack(n)
首先我們首先確認在試驗平台上的各個類型的size,經驗證兩個編譯器的輸出均為:
sizeof(char) = 1
sizeof(short) = 2
sizeof(int) = 4

我們的試驗過程如下:通過#pragma pack(n)改變「對齊系數」,然後察看sizeof(struct test_t)的值。

1、1位元組對齊(#pragma pack(1))
輸出結果:sizeof(struct test_t) = 8 [兩個編譯器輸出一致]
分析過程:
1) 成員數據對齊
#pragma pack(1)
struct test_t {
int a; /* 長度4 < 1 按1對齊;起始offset=0 0%1=0;存放位置區間[0,3] */
char b; /* 長度1 = 1 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */
short c; /* 長度2 > 1 按1對齊;起始offset=5 5%1=0;存放位置區間[5,6] */
char d; /* 長度1 = 1 按1對齊;起始offset=7 7%1=0;存放位置區間[7] */
};
#pragma pack()
成員總大小=8

2) 整體對齊
整體對齊系數 = min((max(int,short,char), 1) = 1
整體大小(size)=$(成員總大小) 按 $(整體對齊系數) 圓整 = 8 /* 8%1=0 */ [注1]

2、2位元組對齊(#pragma pack(2))
輸出結果:sizeof(struct test_t) = 10 [兩個編譯器輸出一致]
分析過程:
1) 成員數據對齊
#pragma pack(2)
struct test_t {
int a; /* 長度4 > 2 按2對齊;起始offset=0 0%2=0;存放位置區間[0,3] */
char b; /* 長度1 < 2 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */
short c; /* 長度2 = 2 按2對齊;起始offset=6 6%2=0;存放位置區間[6,7] */
char d; /* 長度1 < 2 按1對齊;起始offset=8 8%1=0;存放位置區間[8] */
};
#pragma pack()
成員總大小=9

2) 整體對齊
整體對齊系數 = min((max(int,short,char), 2) = 2
整體大小(size)=$(成員總大小) 按 $(整體對齊系數) 圓整 = 10 /* 10%2=0 */

3、4位元組對齊(#pragma pack(4))
輸出結果:sizeof(struct test_t) = 12 [兩個編譯器輸出一致]
分析過程:
1) 成員數據對齊
#pragma pack(4)
struct test_t {
int a; /* 長度4 = 4 按4對齊;起始offset=0 0%4=0;存放位置區間[0,3] */
char b; /* 長度1 < 4 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */
short c; /* 長度2 < 4 按2對齊;起始offset=6 6%2=0;存放位置區間[6,7] */
char d; /* 長度1 < 4 按1對齊;起始offset=8 8%1=0;存放位置區間[8] */
};
#pragma pack()
成員總大小=9

2) 整體對齊
整體對齊系數 = min((max(int,short,char), 4) = 4
整體大小(size)=$(成員總大小) 按 $(整體對齊系數) 圓整 = 12 /* 12%4=0 */

4、8位元組對齊(#pragma pack(8))
輸出結果:sizeof(struct test_t) = 12 [兩個編譯器輸出一致]
分析過程:
1) 成員數據對齊
#pragma pack(8)
struct test_t {
int a; /* 長度4 < 8 按4對齊;起始offset=0 0%4=0;存放位置區間[0,3] */
char b; /* 長度1 < 8 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */
short c; /* 長度2 < 8 按2對齊;起始offset=6 6%2=0;存放位置區間[6,7] */
char d; /* 長度1 < 8 按1對齊;起始offset=8 8%1=0;存放位置區間[8] */
};
#pragma pack()
成員總大小=9

2) 整體對齊
整體對齊系數 = min((max(int,short,char), 8) = 4
整體大小(size)=$(成員總大小) 按 $(整體對齊系數) 圓整 = 12 /* 12%4=0 */

5、16位元組對齊(#pragma pack(16))
輸出結果:sizeof(struct test_t) = 12 [兩個編譯器輸出一致]
分析過程:
1) 成員數據對齊
#pragma pack(16)
struct test_t {
int a; /* 長度4 < 16 按4對齊;起始offset=0 0%4=0;存放位置區間[0,3] */
char b; /* 長度1 < 16 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */
short c; /* 長度2 < 16 按2對齊;起始offset=6 6%2=0;存放位置區間[6,7] */
char d; /* 長度1 < 16 按1對齊;起始offset=8 8%1=0;存放位置區間[8] */
};
#pragma pack()
成員總大小=9

2) 整體對齊
整體對齊系數 = min((max(int,short,char), 16) = 4
整體大小(size)=$(成員總大小) 按 $(整體對齊系數) 圓整 = 12 /* 12%4=0 */

四、結論
8位元組和16位元組對齊試驗證明了「規則」的第3點:「當#pragma pack的n值等於或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果」。另外內存對齊是個很復雜的東西,上面所說的在有些時候也可能不正確。呵呵^_^

[注1]
什麼是「圓整」?
舉例說明:如上面的8位元組對齊中的「整體對齊」,整體大小=9 按 4 圓整 = 12
圓整的過程:從9開始每次加一,看是否能被4整除,這里9,10,11均不能被4整除,到12時可以,則圓整結束。

熱點內容
linux命令大文件 發布:2025-02-08 20:25:06 瀏覽:897
C蟻群演算法 發布:2025-02-08 20:21:25 瀏覽:513
私人搭建伺服器能幹嘛 發布:2025-02-08 20:21:24 瀏覽:596
網吧怎麼通過伺服器玩網路游戲 發布:2025-02-08 19:59:52 瀏覽:914
文檔編輯加密 發布:2025-02-08 19:56:31 瀏覽:392
phpmysql存儲過程實例 發布:2025-02-08 19:54:40 瀏覽:161
淘寶賣的地下城腳本 發布:2025-02-08 19:41:40 瀏覽:62
安卓怎麼把提升畫質關了 發布:2025-02-08 19:40:11 瀏覽:362
我想你加密 發布:2025-02-08 19:39:24 瀏覽:216
java手機號正則表達式 發布:2025-02-08 19:34:50 瀏覽:353