欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++結構體字節(jié)對齊和共用體大小

 更新時間:2021年11月12日 09:53:06   作者:學渣的C/C++  
這篇文章主要介紹了C++結構體字節(jié)對齊和共用體大小,結構體內存對齊在筆試和面試中經常被問到,所以這篇文章做個總結,首先通過代碼驗證不同結構體的內存大小,需要的朋友可以參考下

1、結構體內存對齊

結構體內存對齊在筆試和面試中經常被問到,所以做個總結

通過代碼驗證不同結構體的內存大?。?/strong>

#include <stdio.h>
struct Node1{
    char c1;
    int val1;
    char c2;
};
struct Node2{
    char c1;
    char c2;
    int val1;
};
struct Node3{
    char c1;
    char array[10];
};
struct Node4{
    char val1;
    int arrar[10];
};
int main(){
    printf("Node1 size = %d\n",sizeof(struct Node1));
    printf("Node2 size = %d\n",sizeof(struct Node2));
    printf("Node3 size = %d\n",sizeof(struct Node3));
    printf("Node4 size = %d\n",sizeof(struct Node4));

    return 0;
}

代碼運行結果為:

通過上述代碼運行結果可以發(fā)現Node1Node2定義了相同個數的變量,但是Node1的大小為12,Node2的大小為8,這是為什么呢?

這里首先明確兩個概念:對齊數和最大對齊數,在結構體中對齊數就是每個成員類型的大小,如Node1中,對齊數為{1,4,1},在數組中,對齊數不是數組的大小,而是數組成員的大小,所以Node3的對齊數為{1,1},Node4的對齊數為{1,4}。最大對齊數是對齊數中的最大值(gcc編譯器),最大對齊數可能受編譯器的影響,通常編譯器會有編譯器對齊數,最大對齊數應該是編譯器對齊數和結構體最大對齊數中較小值,如VS編譯器對齊數為8,如果結構體的最大對齊數為16,那么計算結構體的最大對齊數應該為8。我的編譯器為gcc,所以最大對齊數為結構體對齊數中的最大值。

知道最大對齊數后,就可以計算結構體的大小了,需要明確結構體的大小一定是最大對齊數的整數倍。那么Node1和Node2的成員類型是一樣的,為什么Node1的大小為12字節(jié),Node2的大小為8字節(jié)呢。這是因為結構體內存的連續(xù)性,在存儲容量沒有到最大對齊數的內存大小時,只要能夠保存這個成員,結構體就會將該成員變量保存在一個最大對齊樹的內存空間內。這樣就避免了內存的過度浪費。

所以,上述各結構體的內存大小計算方式如下:

  • sizeof(Node1)= 1 + 3(浪費)+ 4 + 1 + 3(浪費) = 12
  • sizeof(Node2)= 1 + 1 + 2(浪費)+ 4 = 8
  • sizeof(Node3) = 1 + 1 * 10 = 11
  • sizeof(Node4) = 1 + 3(浪費)+ 4 * 10 = 44

那么結構體嵌套結構體的大小應該怎么計算呢?舉以下例子:

#include <stdio.h>
struct Node1{
    char c1;
    int val1;
    char c2;
};
struct Node2{
    char c1;
    struct Node1 node;
    double val1;
};

int main(){
    printf("Node1 size = %d\n",sizeof(struct Node1));
    printf("Node2 size = %d\n",sizeof(struct Node2));
    return 0;
}

代碼運行的結果為:

 可以明確,嵌套結構體的對齊數為所嵌套結構體的最大對齊數,所以Node1的對齊數為{1,4,1},Node2的對齊數為{1,4,8},最大對齊數分別為4和8,則代碼里兩個結構體的大小計算方式為:

  • sizeof(Node1)= 1 + 3(浪費)+ 4 + 1 + 3(浪費) = 12
  • sizeof(Node2)= 1 + 7(浪費)+ 12 + 4(浪費)+ 8 = 24

2、共用體的內存大小

對于以下共用體,讀取它大小的代碼如下:

#include <stdio.h>

union un1{
    int val;
    char c;
    double d;
};
union un2{
    int val;
    char array[5];
};

int main(){
    printf("un1 size = %d\n",sizeof(union un1));
    printf("un2 size = %d\n",sizeof(union un2));
    return 0;
}

代碼運行結果為:

 共用體之所以叫共用體,就是因為它的成員變量共享內存,既然共享內存,那么共用體占用的內存空間一定要可以保存內存最大的成員類型,而un1的最大內存成員為double型,大小為8字節(jié),所以un1的大小為8字節(jié),那么un2的內存大小為什么不是5呢?這是因為要內存對齊,共用體也遵循內存對齊原則,un2的最大對齊數是4,因此un2的大小應該是4的整數倍數,所以,sizeof(un2)= 8.

3、枚舉的大小

這里順帶提一下枚舉的內存大小,代碼驗證如下:

#include <stdio.h>

enum Colour {
    RED,
    GREEN,
    BLUE
};
enum ProgramLanguage {
    python = 0xffffffffff,
    c = 8,
    java
};

int main()
{
    printf("Colour size = %d\n",sizeof(enum Colour));
    printf("ProgramLanguage size = %d\n",sizeof(enum ProgramLanguage));
    return 0;
}

代碼運行結果為:

 可見枚舉類型的大小是編譯器根據定義的值自行給定的,實際使用中很少會超出4字節(jié)大小。

到此這篇關于C++結構體字節(jié)對齊和共用體大小的文章就介紹到這了,更多相關結構體字節(jié)對齊和共用體大小內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言中字符和字符串處理(ANSI字符和Unicode字符)

    C語言中字符和字符串處理(ANSI字符和Unicode字符)

    這篇文章主要介紹了C語言與C++中字符和字符串處理(ANSI字符和Unicode字符)的詳細內容,非常的全面,這里推薦給大家,希望大家能夠喜歡。
    2015-03-03
  • 基于C++實現酒店管理系統

    基于C++實現酒店管理系統

    這篇文章主要為大家詳細介紹了基于C++實現酒店管理系統,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家
    2017-04-04
  • C++?自定義單向鏈表?ListNode詳情

    C++?自定義單向鏈表?ListNode詳情

    這篇文章主要介紹了C++?自定義單向鏈表?ListNode詳情,文章將介紹鏈表中不帶頭結點,沒有存放鏈表長度的節(jié)點,從頭結點開始就存放數據得一種,具有一定得參考價值,需要的小伙伴可以參考一下
    2022-03-03
  • C++實現LeetCode(37.求解數獨)

    C++實現LeetCode(37.求解數獨)

    這篇文章主要介紹了C++實現LeetCode(37.求解數獨),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • 主流操作系統平臺的宏定義

    主流操作系統平臺的宏定義

    這篇文章主要介紹了主流操作系統平臺的宏定義,最近正在學習C++程序從Windows 平臺向Unix 平臺移植,參考了 qt 的宏定義文件,需要的朋友可以參考下
    2014-02-02
  • C語言數據結構系列篇二叉樹的遍歷

    C語言數據結構系列篇二叉樹的遍歷

    本章將會詳細講解二叉樹遍歷的四種方式,分別為前序遍歷、中序遍歷、后續(xù)遍歷和層序遍歷。在學習遍歷之前,會先帶大家回顧一下二叉樹的基本概念
    2022-02-02
  • C++數據封裝以及定義結構的詳細講解

    C++數據封裝以及定義結構的詳細講解

    這篇文章主要詳細講解了C++數據封裝以及定義結構,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • 使用Qt框架制作一個表白程序

    使用Qt框架制作一個表白程序

    這篇文章主要為大家詳細介紹了如何使用Qt框架制作一個表白程序,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-01-01
  • C語言數據的存儲超詳細講解上篇

    C語言數據的存儲超詳細講解上篇

    使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內存位置。這意味著,當您創(chuàng)建一個變量時,就會在內存中保留一些空間。您可能需要存儲各種數據類型的信息,操作系統會根據變量的數據類型,來分配內存和決定在保留內存中存儲什么
    2022-04-04

最新評論