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

深入分析C++中類的大小

 更新時間:2013年05月04日 09:20:40   作者:  
本篇文章深入分析了C++中類的大小問題。需要的朋友參考下

首先看一個例子:

復(fù)制代碼 代碼如下:

#include <iostream>
 using namespace std;

 class A{};

 class B
 {
     int b;
     char c;
 };

 class C
 {
     int c1;   
     static int c2;
 };
 int C::c2 = 1;

 class D:public C,public B{
     int d;
 };
 int main()
 {
     cout<<"sizeof(A)="<<sizeof(A)<<endl;
     cout<<"sizeof(B)="<<sizeof(B)<<endl;
     cout<<"sizeof(C)="<<sizeof(C)<<endl;
     cout<<"sizeof(D)="<<sizeof(D)<<endl;

     return 0;
 }

運行結(jié)果為:

sizeof(A)=1

sizeof(B)=8

sizeof(C)=4

sizeof(D)=16


對于類A來說,雖然A是一個空類,但為了便于空類進(jìn)行實例化,編譯器往往會給它分配一個字節(jié),這樣A實例化后便在內(nèi)存中有了一個獨一無二的地址.對于類B,B的大小應(yīng)為sizeof(int)+sizeof(char)=5,但是考慮內(nèi)存對齊,B的大小應(yīng)為8.對于類C,類的靜態(tài)成員變量被放在全局區(qū),和類的普通成員并沒有放在一塊。類的靜態(tài)成員被聲明后就已存在,而非靜態(tài)成員只有類被實例化后才存在。所以C的大小為sizeof(int)=4。D的大小為B+C的大小+自身數(shù)據(jù)成員的大小,一共為16.

 

==========================分割線在這里====================================

下面討論含有虛函數(shù)的類的大?。?BR>

復(fù)制代碼 代碼如下:

#include <iostream>
 using namespace std;

 class A
 {
 public:
     void virtual aa(){};
 };

 class B:public A
 {
     void virtual bb(){};
 };

 class C:virtual A
 {
 public:
     void virtual aa(){};
     void cc(){};
 };

 class D:virtual A
 {
 public:
     void virtual dd(){};
 };

 int main()
 {
     cout<<"sizeof(A)="<<sizeof(A)<<endl;
     cout<<"sizeof(B)="<<sizeof(B)<<endl;
     cout<<"sizeof(C)="<<sizeof(C)<<endl;
     cout<<"sizeof(D)="<<sizeof(D)<<endl;

     return 0;
 }

運行結(jié)果為:

sizeof(A)=4

sizeof(B)=4

sizeof(C)=8

sizeof(D)=12

對于class A,它含有一個虛函數(shù),編譯器會為虛函數(shù)生成一張?zhí)摵瘮?shù)表,來記錄對應(yīng)的函數(shù)地址,為此,在class A的內(nèi)存地址中要有一個vfptr_A指針指向這個虛表,所以class A的大小為指針大小,即4.(注意,無論類中有多少個虛函數(shù),它們的大小都是4,因為內(nèi)存中只需要保存這個指針即可)。

對于class B,它是public繼承A,雖然它也有一個虛函數(shù),但是從結(jié)果看,B應(yīng)該和A都在B的vtable(虛表中),所以class B的大小為4.

對于class C,它是vitual 繼承A,所以要有一個指向父類A的指針,占有4字節(jié)大小aa()是繼承自class A的虛函數(shù),從結(jié)果來看,它沒有在內(nèi)存中占有空間,所以C的大小為sizeof(A)+4=8.

對于class D,它是虛繼承class A,同上,要有一個指向父類A的指針,同時,class D中有虛函數(shù),所以要有一個指向虛表的指針,所以sizeof(D)=sizeof(A)+4+4=12

相關(guān)文章

  • C++STL函數(shù)和排序算法的快排以及歸并排序詳解

    C++STL函數(shù)和排序算法的快排以及歸并排序詳解

    這篇文章主要為大家詳細(xì)介紹了C++STL函數(shù)和排序算法的快排以及歸并排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 深入了解一下C語言中的柔性數(shù)組

    深入了解一下C語言中的柔性數(shù)組

    柔性數(shù)組是在C99中定義的,即結(jié)構(gòu)體的最后一個元素允許是未知大小的數(shù)組,這就叫柔性數(shù)組。這篇文章將通過簡單的示例為大家介紹一下柔性數(shù)組的使用,感興趣的可以了解一下
    2023-02-02
  • C語言實現(xiàn)登錄注冊和忘記密碼功能

    C語言實現(xiàn)登錄注冊和忘記密碼功能

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)登錄、注冊和忘記密碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++ Boost MetaStateMachine定義狀態(tài)機(jī)超詳細(xì)講解

    C++ Boost MetaStateMachine定義狀態(tài)機(jī)超詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-12-12
  • Qt讀寫XML文件的方法詳解(含源碼+注釋)

    Qt讀寫XML文件的方法詳解(含源碼+注釋)

    XML文件可以用來存儲項目中的數(shù)據(jù),它相當(dāng)于一個簡單的數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于Qt讀寫XML文件(含源碼+注釋)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • C++設(shè)計模式之命令模式

    C++設(shè)計模式之命令模式

    這篇文章主要介紹了C++設(shè)計模式之命令模式,本文講解了什么是命令模式、命令模式的使用場合等內(nèi)容,并給出了一個代碼實例,需要的朋友可以參考下
    2014-10-10
  • C++實現(xiàn)模板方法模式的示例代碼

    C++實現(xiàn)模板方法模式的示例代碼

    這篇文章主要介紹了++實現(xiàn)模板方法模式,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • C語言簡單實現(xiàn)銀行ATM存取款功能

    C語言簡單實現(xiàn)銀行ATM存取款功能

    這個是大一時期寫的。大四的時候整理了一下(本人C語言學(xué)的也不太好)??隙ê芏嗖蛔愫痛嬖诼┒吹牡胤健H供借鑒、僅供借鑒,代碼中有大量注釋,新手看起來也沒有困難
    2021-11-11
  • C/C++實現(xiàn)crc碼計算和校驗

    C/C++實現(xiàn)crc碼計算和校驗

    循環(huán)冗余校驗(Cyclic Redundancy Check, CRC)是一種根據(jù)網(wǎng)絡(luò)數(shù)據(jù)包或計算機(jī)文件等數(shù)據(jù)產(chǎn)生簡短固定位數(shù)校驗碼的一種信道編碼技術(shù)。本文主要介紹了C++實現(xiàn)crc碼計算和校驗的方法,需要的可以參考一下
    2023-03-03
  • C++中順序表操作的示例代碼

    C++中順序表操作的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C++中順序表的基礎(chǔ)操作的相關(guān)代碼,主要有順序表的輸出、插入和刪除數(shù)據(jù)等,感興趣的小伙伴可以了解一下
    2022-10-10

最新評論