国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

服務器之家 - 編程語言 - C/C++ - C++類的大小介紹

C++類的大小介紹

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

這篇文章主要介紹了C++類的大小,在C++中,結構體和類的唯一區別就是結構體和類具有不同的默認訪問控制屬性,下面一起進入文章查看詳細內容

1、C++結構體和類的關系

為什么講C++類的大小要提到結構體呢,因為可能很多和我一樣的學子,接觸過C語言的結構體對齊,但不明白類的大小怎么計算,這其中都要用到內存對齊的概念,對于內存對齊的概念之前已經說過了,可以參考這篇博客:結構體字節對齊和共用體大小 明白結構體的內存大小計算后,就要明白類和結構體的關系:

在C++中,結構體和類的唯一區別就是: 結構體和類具有不同的默認訪問控制屬性。

  類中,對于未指定訪問控制屬性的成員,其訪問控制屬性為私有類型(private)。

  結構體中,對于未指定任何訪問控制屬性的成員,其訪問控制屬性為公有類型(public)。

所以結構體的大小和類的大小是一樣的,在C++中,結構體也可以實現實現繼承和多態(可能很驚訝,可以去看看這篇博文:C++中結構體與類的區別,還要明確,靜態成員變量和成員函數所占用的空間肯定不是結構體或類的空間。還有就是空的類的大小是1字節,以方便類進行實例化。

代碼進行驗證:

#include <iostream>
using namespace std;

struct Node {

};

class Test{

};

int main () {
  cout << "sizeof(struct Node) = " << sizeof(Node) << endl; 
  cout << "sizeof(class Test) =" << sizeof(Test) << endl;
  system("pause");
  return 0;

}

代碼運行結果為:

C++類的大小介紹

 

2、繼承類的大小

繼承允許我們依據另一個類來定義一個類,會把一個類的成員大小都繼承下來,所以繼承了的派生類大小一定要考慮基類的大小,首先考慮的最大對齊數,派生類的最大對齊數要考慮基類的最大對齊數。

下面以實際代碼進行說明:

#include <iostream>
using namespace std;


class Base{
public:
  void func() {  //成員函數不占用類的空間大小

  }
private:
  static int m_val1; // 靜態成員不占用類的空間
  int m_valInt;
  char m_valChar;
  double m_valDouble;
};

class Son:public Base{
public:
  static int func() { //靜態成員函數也不占用內存空間
      return 0;
  }
private:
  int m_sonValint;
};


int main () {
  cout << "sizeof(Base) = " << sizeof(Base) << endl; 
  cout << "sizeof(Son)  = " << sizeof(Son) << endl;
  system("pause");
  return 0;

}

代碼運行結果為:

C++類的大小介紹

可以明確,靜態成員變量和成員函數所占用的空間類的空間,所以Base類的最大對齊數為double類型的大小(8字節),按照順序存儲,

Base類的大小計算應該為:

sizeof(Base)= 4 + 1 + 3(浪費) + 8 = 16字節

Son類繼承了Base類,它的最大對齊數也就是8字節,

所以Son類的大小計算應該為:

sizeof(Son) = 4 + 1 + 3(浪費) + 8 + 8 = 24字節

注意類的也要考慮存儲順序,如果把Base類中的m_valChar放到m_valDouble后面,

Base類的大小計算就變成了:

sizeof(Base)= 4 + 4(浪費)+ 8 + 1 + 7(浪費)= 24字節

Son類的大小就算就變成了:

sizeof(Son)= 4 + 4(浪費)+ 8 + 1 + 3(浪費) + 4= 24字節

由此可以推算出多繼承類的大小計算,菱形繼承也是一樣,都會繼承基類的內存,尤其注意虛繼承的情況,虛繼承只是避免了菱形繼承出現的二義性,但不是不繼承,

如以下代碼:

#include <iostream>
using namespace std;

class Base{
public:
  void func() {  //成員函數不占用類的空間大小

  }
public:
  double m_valDouble;
};

class Son1:virtual public Base{}; //虛繼承
class Son2:virtual public Base{}; //虛繼承
class GrandSon:public Son1,public Son2{};

int main () {
 
  cout << "sizeof(GrandSon)  = " << sizeof(GrandSon) << endl;
  GrandSon gs;
  // gs.m_valDouble = 10; //如果不是虛繼承就會出現二義性
  
  system("pause");
  return 0;

}

代碼運行結果為:

C++類的大小介紹

上述GrandSon的依舊為16字節,因為它從Son1繼承來了一份,又從Son2繼承來了一份,所以,虛繼承只是避免了訪問的二義性,也可見菱形繼承會對內存空間造成浪費 。

 

3、多態類的大小

多態類唯一的區別就是計算類大小要考慮到虛寒表指針的大小,指針的大小和系統相關,32位機器為4字節,64位機器為8字節,指針的大小也要作為最大對齊數的考慮范圍。

代碼說明如下:

#include <iostream>
using namespace std;

class Base{
public:
  virtual void func() = 0; //純虛函數,會生成虛函數表指針
public:
  char m_valChar;
};

class Son: public Base{
public:
  void func() {};
public:
  int m_SonvalInt;
};

int main () {
 
  cout << "sizeof(Base) = " << sizeof(Base) << endl;
  cout << "sizeof(Son)  = " << sizeof(Son) << endl; 

  system("pause");
  return 0;

}

代碼運行結果為:

C++類的大小介紹

Base類的大小為8字節,是因為虛函數表指針占用了4字節,所以Base類的最大對齊數為4字節,虛函數表在構造函數的時候就會生成,所以,虛函數表指針肯定優先存儲,

所以Base類大小的計算為:

sizeof(Base) = 4 + 1 + 3(浪費) = 8字節

則Son類的大小計算為:

sizeof(Son)= 4 + 1 + 3(浪費) + 4 = 12字節

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

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

延伸 · 閱讀

精彩推薦
  • C/C++深入理解goto語句的替代實現方式分析

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

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

    C語言教程網7342020-12-03
  • C/C++c++ 單線程實現同時監聽多個端口

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

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

    源之緣11542021-10-27
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

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

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

    spring-go5642021-07-02
  • C/C++C++之重載 重定義與重寫用法詳解

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

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

    青山的青6062022-01-04
  • C/C++C語言中炫酷的文件操作實例詳解

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

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

    針眼_6702022-01-24
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

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

    xiaocaidayong8482021-08-20
  • C/C++C/C++經典實例之模擬計算器示例代碼

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

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

    jia150610152021-06-07
  • C/C++學習C++編程的必備軟件

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

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

    謝恩銘10102021-05-08
主站蜘蛛池模板: 国产精品久久影院 | 天天天操 | 成人精品视频99在线观看免费 | 免费国产视频 | 亚洲精品国产综合99久久夜夜嗨 | 中文字幕在线免费 | 成人av电影网 | 天天操天天插 | 精品久久av| 黄瓜av| 成人久久久久久久 | 国产精品国产三级国产aⅴ 亚洲精品免费在线观看 | 精品久久久久久久久久久久 | 最近免费观看高清韩国日本大全 | 色香蕉久久 | 久久亚洲国产精品 | 黄色美女网站视频 | 中文字幕免费观看 | 久久久久久亚洲一区二区三区蜜臀 | 自拍偷拍一区 | 欧美日本韩国一区二区 | 久久久高清 | 久久久久久久久久久精 | 成人福利| 成人在线小视频 | 山岸逢花在线观看 | 亚洲综合区| 亚洲欧美日韩一区二区 | 日韩a在线 | 在线观看国产二区 | 日韩精品一区二区在线 | 黄色小视频在线免费观看 | 色a视频 | 国产在线一区二区三区 | 日韩中文视频 | 午夜精品久久久久久久久久久久 | 91高清在线| 欧洲精品一区 | 欧美大黄大色一级毛片 | 欧美成人激情 | 性网站在线 |