一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++結構體字節對齊和共用體大小

C++結構體字節對齊和共用體大小

2022-02-22 14:37學渣的C/C++ C/C++

這篇文章主要介紹了C++結構體字節對齊和共用體大小,結構體內存對齊在筆試和面試中經常被問到,所以這篇文章做個總結,首先通過代碼驗證不同結構體的內存大小,需要的朋友可以參考下

1、結構體內存對齊

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

通過代碼驗證不同結構體的內存大小:

#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;
}

代碼運行結果為:

C++結構體字節對齊和共用體大小

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

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

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

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

  • 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;
}

代碼運行結果為:

C++結構體字節對齊和共用體大小

共用體之所以叫共用體,就是因為它的成員變量共享內存,既然共享內存,那么共用體占用的內存空間一定要可以保存內存最大的成員類型,而un1的最大內存成員為double型,大小為8字節,所以un1的大小為8字節,那么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;
}

代碼運行結果為:

C++結構體字節對齊和共用體大小

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

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

原文鏈接:https://www.cnblogs.com/qin6666/p/15483965.html

延伸 · 閱讀

精彩推薦
  • C/C++學習C++編程的必備軟件

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

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
主站蜘蛛池模板: 青青视频国产依人在线 | 国产欧美成人免费观看 | 欧美老妪 | 四虎影视国产精品婷婷 | 免费网站看v片在线成人国产系列 | 国产精品日韩欧美一区二区三区 | 北条麻妃一区 | 国产日韩欧美成人 | 四虎影院精品在线观看 | 青青草原手机在线视频 | 91久久青青青国产免费 | nxgx在线观看国产中文 | 欧洲喷浆乌克兰 | 天堂avav | 精品无人区乱码1区2区3区在线 | 97网站 | dasd-698黑人在线播放 | 四虎4hu新地址入口 四虎1515h永久 | 日韩一区二区三区四区五区 | 向日葵视频app下载18岁以下勿看 | 日本视频二区 | 2022国产麻豆剧传媒古装 | 4hu永久地域网名入口 | 亚洲高清视频在线 | 午夜毛片在线观看 | 99撸| 午夜国产精品视频 | 男女肉粗暴进来下面好紧 | 好 舒服 好 粗 好硬 好爽 | 午夜五月天 | 国产精品一级片 | 欧美日日操 | 亚洲高清国产品国语在线观看 | 国产高清在线播放刘婷91 | 水多多www视频在线观看高清 | 久久热国产在线视频 | 欧美亚洲国产精品久久第一页 | 91桃色视频在线观看 | 色婷婷综合久久久中文字幕 | 欧美成人免费一区在线播放 | 91精品手机国产在线观 |