激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

香港云服务器
服務(wù)器之家 - 編程語言 - C/C++ - C++結(jié)構(gòu)體字節(jié)對(duì)齊和共用體大小

C++結(jié)構(gòu)體字節(jié)對(duì)齊和共用體大小

2022-02-22 14:37學(xué)渣的C/C++ C/C++

這篇文章主要介紹了C++結(jié)構(gòu)體字節(jié)對(duì)齊和共用體大小,結(jié)構(gòu)體內(nèi)存對(duì)齊在筆試和面試中經(jīng)常被問到,所以這篇文章做個(gè)總結(jié),首先通過代碼驗(yàn)證不同結(jié)構(gòu)體的內(nèi)存大小,需要的朋友可以參考下

1、結(jié)構(gòu)體內(nèi)存對(duì)齊

結(jié)構(gòu)體內(nèi)存對(duì)齊在筆試和面試中經(jīng)常被問到,所以做個(gè)總結(jié)

通過代碼驗(yàn)證不同結(jié)構(gòu)體的內(nèi)存大小:

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

代碼運(yùn)行結(jié)果為:

C++結(jié)構(gòu)體字節(jié)對(duì)齊和共用體大小

通過上述代碼運(yùn)行結(jié)果可以發(fā)現(xiàn)Node1和Node2定義了相同個(gè)數(shù)的變量,但是Node1的大小為12,Node2的大小為8,這是為什么呢?

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

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

所以,上述各結(jié)構(gòu)體的內(nèi)存大小計(jì)算方式如下:

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

那么結(jié)構(gòu)體嵌套結(jié)構(gòu)體的大小應(yīng)該怎么計(jì)算呢?舉以下例子:

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

代碼運(yùn)行的結(jié)果為:

可以明確,嵌套結(jié)構(gòu)體的對(duì)齊數(shù)為所嵌套結(jié)構(gòu)體的最大對(duì)齊數(shù),所以Node1的對(duì)齊數(shù)為{1,4,1},Node2的對(duì)齊數(shù)為{1,4,8},最大對(duì)齊數(shù)分別為4和8,則代碼里兩個(gè)結(jié)構(gòu)體的大小計(jì)算方式為:

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

 

2、共用體的內(nèi)存大小

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

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

代碼運(yùn)行結(jié)果為:

C++結(jié)構(gòu)體字節(jié)對(duì)齊和共用體大小

共用體之所以叫共用體,就是因?yàn)樗某蓡T變量共享內(nèi)存,既然共享內(nèi)存,那么共用體占用的內(nèi)存空間一定要可以保存內(nèi)存最大的成員類型,而un1的最大內(nèi)存成員為double型,大小為8字節(jié),所以u(píng)n1的大小為8字節(jié),那么un2的內(nèi)存大小為什么不是5呢?這是因?yàn)橐獌?nèi)存對(duì)齊,共用體也遵循內(nèi)存對(duì)齊原則,un2的最大對(duì)齊數(shù)是4,因此un2的大小應(yīng)該是4的整數(shù)倍數(shù),所以,sizeof(un2)= 8.

 

3、枚舉的大小

這里順帶提一下枚舉的內(nèi)存大小,代碼驗(yàn)證如下:

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

代碼運(yùn)行結(jié)果為:

C++結(jié)構(gòu)體字節(jié)對(duì)齊和共用體大小

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

到此這篇關(guān)于C++結(jié)構(gòu)體字節(jié)對(duì)齊和共用體大小的文章就介紹到這了,更多相關(guān)結(jié)構(gòu)體字節(jié)對(duì)齊和共用體大小內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

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

延伸 · 閱讀

精彩推薦
502
主站蜘蛛池模板: 中国美女一级黄色大片 | 欧美a视频 | 亚洲一二区视频 | 久久国产精品99久久人人澡 | 午夜精品老牛av一区二区三区 | 久久免费视频7 | 欧美精品一区二区三区在线 | 毛片免费视频观看 | 免费在线观看毛片 | 干一夜综合 | 欧美日韩手机在线观看 | 中文字幕欧美日韩 | 91午夜视频 | 免费观看三级毛片 | 国产精品久久久久久久久久久久午夜 | 欧美三级短视频 | 最新一区二区三区 | 成人黄色小视频网站 | 国产成人高清成人av片在线看 | xfplay噜噜av | 国产精品高潮视频 | 国产亚洲小视频 | 毛片在线视频在线播放 | 国产精品久久久不卡 | 国产91精品一区二区麻豆亚洲 | 深夜小视频在线观看 | 一级毛片播放 | jizzzxxxxhd| 日韩一级片免费 | 毛片免费视频播放 | 国内成人自拍视频 | 国产又粗又爽又深的免费视频 | 爱视频福利 | 国产精品午夜性视频 | 天堂精品久久 | 97人人草 | 九色激情网 | 日日操夜夜透 | 国产精品一区99 | 国产精品hd免费观看 | 欧美成人精品一区 |