c語言位元組對齊問題詳解下載,C語言位元組對齊

本文目錄一覽:

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

仔細看一下書中的說明吧,這三言兩語介紹起來有點累

或從網上查閱相關的技術資料,有詳細描述。

一般簡單來說,結構體從第一個變數開始檢查空間的「對齊位元組數」,

默認以第一個位元組大小作為對齊位元組數,如果遇上的下一個位元組與當前對齊位元組數不同時,就按兩者中較大的來進行結構體空間分配,接下來的對齊就全按此值來對齊,直到再遇上不同的才進行檢查或改變。

什麼是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)指定結構體位元組對齊的話,後面的方式移植到其它系統可能會出現死機問題。

C語言位元組對齊問題

目前編譯器上(我是說visual c++)如果沒有特別設置的話, 默認的對齊方式按下面幾個規律

1. 每個成員對齊到它長度的整數倍

2. 整個結構的長度對齊到它最長成員長度的整數倍

3. 上面所說的長度,超過4的按4算。

就這個來說, b欄位會被對齊到2位元組位置, 最後整個會被對齊到6位元組長

我不知道這幾點是標準還是實現, 以後會不會有變化

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

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

#include stdio.h

struct chji

{

char name[9];

int number;

char sex;

double score;

float aa;

};

struct chji stu;

int main()

{

printf(“sizeof(struct chji)=%d\n”,sizeof(struct chji));

return 0;

}

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

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

#include stdio.h

#pragma pack(1)

struct chji

{

char name[9];  //9

int number;    //4

char sex;      //1

double score;  //8

float aa;      //4

};

struct chji stu;

#pragma pack()

int main()

{

printf(“sizeof(struct chji)=%d\n”,sizeof(struct chji));

return 0;

}

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

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

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/254937.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-15 12:14
下一篇 2024-12-15 12:14

相關推薦

  • Python官網中文版:解決你的編程問題

    Python是一種高級編程語言,它可以用於Web開發、科學計算、人工智慧等領域。Python官網中文版提供了全面的資源和教程,可以幫助你入門學習和進一步提高編程技能。 一、Pyth…

    編程 2025-04-29
  • 如何解決WPS保存提示會導致宏不可用的問題

    如果您使用過WPS,可能會碰到在保存的時候提示「文件中含有宏,保存將導致宏不可用」的問題。這個問題是因為WPS在默認情況下不允許保存帶有宏的文件,為了解決這個問題,本篇文章將從多個…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • Java Thread.start() 執行幾次的相關問題

    Java多線程編程作為Java開發中的重要內容,自然會有很多相關問題。在本篇文章中,我們將以Java Thread.start() 執行幾次為中心,為您介紹這方面的問題及其解決方案…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python爬蟲亂碼問題

    在網路爬蟲中,經常會遇到中文亂碼問題。雖然Python自帶了編碼轉換功能,但有時候會出現一些比較奇怪的情況。本文章將從多個方面對Python爬蟲亂碼問題進行詳細的闡述,並給出對應的…

    編程 2025-04-29
  • NodeJS 建立TCP連接出現粘包問題

    在TCP/IP協議中,由於TCP是面向位元組流的協議,發送方把需要傳輸的數據流按照MSS(Maximum Segment Size,最大報文段長度)來分割成若干個TCP分節,在接收端…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29

發表回復

登錄後才能評論