最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中字節(jié)對齊的幾種方式小結(jié)

 更新時(shí)間:2025年12月18日 10:12:31   作者:青椒肉炒肉絲  
本文介紹了C語言中的字節(jié)對齊機(jī)制,包括自然對齊、預(yù)處理指令和編譯器屬性語法三種對齊方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

C語言調(diào)試筆記,C語言中字節(jié)對齊的幾種方式記錄一下

字節(jié)對齊是指數(shù)據(jù)存儲時(shí)按照一定的規(guī)則在內(nèi)存中排列,使得數(shù)據(jù)的訪問效率更高

一、自然對齊(默認(rèn)對齊方式)

1.原理:

自然對齊是編譯器默認(rèn)的對齊方式。在這種方式下,數(shù)據(jù)類型按照其自身的長度進(jìn)行對齊存儲。

例如,char類型(通常為 1 字節(jié))可以從任意地址開始存儲,因?yàn)樗拈L度就是 1 字節(jié);

short類型(通常為 2 字節(jié))的存儲地址是 2 的倍數(shù);

int類型(通常為 4 字節(jié))的存儲地址是 4 的倍數(shù);

double類型(通常為 8 字節(jié))的存儲地址是 8 的倍數(shù)等。

2.舉例:

#include <stdio.h>
struct NaturalAlignment {
    char c;   // 1字節(jié),地址可以是任意位置
    int i;    // 4字節(jié),會自動對齊到4的倍數(shù)地址
    short s;  // 2字節(jié),因?yàn)榍懊娴膇nt已經(jīng)是4字節(jié)對齊,所以這里也自然對齊
};
int main() {
    struct NaturalAlignment na;
    printf("Size of struct NaturalAlignment: %ld\n", sizeof(na));
    // 輸出結(jié)果通常為1 + (3 padding) + 4 + 2 = 10字節(jié)
    // 其中3字節(jié)是為了讓int能從4的倍數(shù)地址開始存儲而填充的字節(jié)
    return 0;
}

注意! 某些編譯器可能執(zhí)行結(jié)果是12,這跟32位和64位系統(tǒng)中機(jī)器字長有關(guān)。但是我們驗(yàn)證的是此種對齊方式

二、預(yù)處理指令

1.原理:

#pragma pack(n) 是一種預(yù)處理指令,用于指定結(jié)構(gòu)體或聯(lián)合體成員的對齊方式。

其中n表示對齊字節(jié)數(shù),編譯器會按照這個指定的字節(jié)數(shù)來對齊成員。

它會盡量按照不超過n字節(jié)的邊界來對齊成員,但如果成員本身長度大于n,則按照成員自身長度對齊

2.舉例

代碼如下(示例):

#include <stdio.h>
#pragma pack(1)  // 指定按1字節(jié)對齊
struct PackedAlignment1 {
    char c;
    int i;
    short s;
};
#pragma pack()   // 恢復(fù)默認(rèn)對齊方式
#pragma pack(2)  // 指定按2字節(jié)對齊
struct PackedAlignment2 {
    char c;
    int i;
    short s;
};
#pragma pack()   // 恢復(fù)默認(rèn)對齊方式
int main() {
    struct PackedAlignment1 pa1;
    struct PackedAlignment2 pa2;
    printf("Size of struct PackedAlignment1: %ld\n", sizeof(pa1));
    // 輸出結(jié)果為1 + 4 + 2 = 7字節(jié),因?yàn)榘?字節(jié)對齊,沒有填充字節(jié)
    printf("Size of struct PackedAlignment2: %ld\n", sizeof(pa2));
    // 輸出結(jié)果為1 + (1 padding) + 4 + 2 = 8字節(jié)
    // 因?yàn)榘?字節(jié)對齊,char后填充1字節(jié)使int能從2的倍數(shù)地址開始存儲
    return 0;
}

三、編譯器一種屬性語法

1.原理

這是 GCC 編譯器提供的一種屬性語法,用于指定變量或類型的對齊字節(jié)數(shù)。

它主要用于對結(jié)構(gòu)體、聯(lián)合體或者變量強(qiáng)制指定對齊方式,n為對齊字節(jié)數(shù)。

當(dāng)用于結(jié)構(gòu)體時(shí),整個結(jié)構(gòu)體的大小會是n的倍數(shù)。

2.舉例

#include <stdio.h>
struct AlignedAttribute {
    char c;
    int i;
    short s;
}__attribute__((aligned(4)));  // 指定結(jié)構(gòu)體按4字節(jié)對齊
int main() {
    struct AlignedAttribute aa;
    printf("Size of struct AlignedAttribute: %ld\n", sizeof(aa));
    // 輸出結(jié)果為4 + 4 + 4 = 12字節(jié)
    // 因?yàn)榘?字節(jié)對齊,char后填充3字節(jié),short后填充2字節(jié)
    // 使整個結(jié)構(gòu)體大小是4的倍數(shù)
    return 0;
}

總結(jié)

這些字節(jié)對齊方式在不同的場景下有不同的用途。在需要精確控制內(nèi)存布局或者與硬件設(shè)備進(jìn)行數(shù)據(jù)交互時(shí),合理的字節(jié)對齊方式可以確保數(shù)據(jù)的正確讀寫和高效傳輸

到此這篇關(guān)于C語言中字節(jié)對齊的幾種方式小結(jié)的文章就介紹到這了,更多相關(guān)C語言 字節(jié)對齊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • VScode搭建OpenCV環(huán)境的詳細(xì)步驟

    VScode搭建OpenCV環(huán)境的詳細(xì)步驟

    用vscode來寫opencv代碼需要自己編譯OpenCV,主要用到MinGW-w64和CMake工具。接下來通過本文給大家介紹VScode搭建OpenCV環(huán)境的相關(guān)知識,需要的朋友可以參考下
    2021-11-11
  • c++將vector迭代器轉(zhuǎn)換為指針的實(shí)現(xiàn)方式

    c++將vector迭代器轉(zhuǎn)換為指針的實(shí)現(xiàn)方式

    這篇文章主要介紹了c++將vector迭代器轉(zhuǎn)換為指針的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • KMP 算法實(shí)例詳解

    KMP 算法實(shí)例詳解

    這篇文章主要介紹了KMP 算法實(shí)例詳解的相關(guān)資料,MP的關(guān)鍵是求出next的值、先預(yù)處理出next的值,需要的朋友可以參考下
    2017-07-07
  • C++基礎(chǔ)入門教程(五):new和delete

    C++基礎(chǔ)入門教程(五):new和delete

    這篇文章主要介紹了C++基礎(chǔ)入門教程(五):new和delete,本文講解了動態(tài)分配內(nèi)存、new和delete的配對、new、delete與reatin、release的關(guān)系、動態(tài)數(shù)組等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • C++之初始化列表詳解(initializer_list)

    C++之初始化列表詳解(initializer_list)

    C++11引入std::initializer_list,用于封裝列表初始化的語法糖,實(shí)現(xiàn)容器、函數(shù)等場景的統(tǒng)一初始化方式,其本質(zhì)是輕量級只讀視圖,不存儲元素,僅通過指針和長度管理序列,支持容器構(gòu)造、參數(shù)傳遞等操作,但需注意生命周期與只讀限制
    2025-09-09
  • C++11中使用using的方法

    C++11中使用using的方法

    在 C++ 中 using 用于聲明命名空間,使用命名空間也可以防止命名沖突。這篇文章主要介紹了C++11中使用using的方法,需要的朋友可以參考下
    2021-09-09
  • C++ STL中的容器適配器實(shí)現(xiàn)

    C++ STL中的容器適配器實(shí)現(xiàn)

    這篇文章主要介紹了C++ STL中的容器適配器實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 6個變態(tài)的C語言Hello World程序

    6個變態(tài)的C語言Hello World程序

    這篇文章主要介紹了6個變態(tài)的C語言Hello World程序,需要的朋友可以參考下
    2016-05-05
  • C指針原理教程之Ncurses介紹

    C指針原理教程之Ncurses介紹

    Ncurses 提供字符終端處理庫,包括面板和菜單。為了能夠使用ncurses庫,您必須在您的源程序中將curses.h包括(include)進(jìn)來,而且在編譯的需要與它連接起來. 在gcc中您可以使用參數(shù)-lcurses進(jìn)行編譯.
    2019-02-02
  • 從頭學(xué)習(xí)C語言之指針和數(shù)組

    從頭學(xué)習(xí)C語言之指針和數(shù)組

    這篇文章主要為大家詳細(xì)介紹了C語言之指針和數(shù)組,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01

最新評論

准格尔旗| 东乌珠穆沁旗| 香港| 白银市| 安国市| 兰州市| 惠东县| 西青区| 始兴县| 凌云县| 迁西县| 龙岩市| 织金县| 罗甸县| 金门县| 南宁市| 焦作市| 宜昌市| 革吉县| 白山市| 商丘市| 荣昌县| 阿拉善左旗| 正定县| 崇仁县| 古浪县| 辽宁省| 吉安县| 五指山市| 垦利县| 石棉县| 祥云县| 绩溪县| 苍南县| 怀集县| 赤壁市| 泰兴市| 长宁区| 迁安市| 怀集县| 南昌县|