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

編譯器位元組對齊

發布時間: 2022-04-28 22:16:50

❶ c/c++ 內存位元組對齊

內存對齊:
數據的地址必須是其size的整數倍
比如
int
內存必須是4的倍數
在上面的數據結構,
int前面有4個(1+2+1),所以int是第5個,
不是4的倍數,所以編譯器會把int的第一個改到第9個,
這樣s1的長度就是8+4
=
12

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

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

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

這個問題都很有深度啊;

首先我要說的是,位元組對齊在不同編譯器下語法是不一樣的,在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位元組~

❹ 問下,機器位元組對齊問題,是不是有個默認對齊值啊,struct{char a;double b;}

VC和GCC默認的都是4位元組對齊,編程中可以使用#pragma pack(n)指定對齊模數。出現以上差異的原因在於,VC和GCC中對於double類型的對齊方式不同。
Win32平台下的微軟VC編譯器在默認情況下採用如下的對齊規則: 任何基本數據類型T的對齊模數就是T的大小,即sizeof(T)。比如對於double類型(8位元組),就要求該類型數據的地址總是8的倍數,而char類型數據(1位元組)則可以從任何一個地址開始。
Linux下的GCC奉行的是另外一套規則:任何2位元組大小(包括單位元組嗎?)的數據類型(比如short)的對齊模數是2,而其它所有超過2位元組的數據類型(比如long,double)都以4為對齊模數。

復雜類型(如結構)的默認對齊方式是它最長的成員的對齊方式,這樣在成員是復雜類型時,可以最小化長度。
struct{char a;double b;}
在VC中,因為結構中存在double和char,按照最長數據類型對齊,char只佔1B,但是加上後面的double所佔空間超過8B,所以char獨佔8B;而double佔8B,一共16Byte。
在GCC中,double長度超過4位元組,按照4位元組對齊,原理同上,不過char佔4位元組,double占兩個4位元組,一共12Byte。

❺ C語言位元組對齊怎麼操作

成為一名合格的IT人才

❻ 關於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語言結構體長度位元組對齊問題

因為當結構體中有多個數據類型時,結構體的長度對齊是按數據類型長度最長的那個來對齊的,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()相關的資料的,就會清楚了。

熱點內容
linux刪除連接 發布:2024-05-18 20:06:56 瀏覽:820
linux搭建雲伺服器平台 發布:2024-05-18 19:52:21 瀏覽:400
安卓怎麼關閉美易訂閱 發布:2024-05-18 19:29:16 瀏覽:642
蘋果手機配置代理伺服器怎麼開 發布:2024-05-18 19:29:07 瀏覽:229
伺服器屏蔽了別人的ip 發布:2024-05-18 19:10:09 瀏覽:619
怎麼獲取ins伺服器地址 發布:2024-05-18 19:10:03 瀏覽:30
仙方一般是什麼配置 發布:2024-05-18 18:53:43 瀏覽:159
黑莓安卓手機主題下載到哪裡 發布:2024-05-18 18:47:18 瀏覽:57
湯靖軒編程 發布:2024-05-18 18:46:04 瀏覽:533
腳本故事梗 發布:2024-05-18 18:29:02 瀏覽:823