1. 程式人生 > 其它 >c++:空類及其子類的佔用空間問題

c++:空類及其子類的佔用空間問題

技術標籤:c++常見知識點整理(11標準之前)c++

目錄

1、空的struct/class佔多大空間,為什麼佔這麼多?

2、繼承空類的子類佔用多大空間?

3、繼承空類的空子類佔用多大空間呢?


1、空的struct/class佔多大空間,為什麼佔這麼多?

/*================================================================
*   Copyright (C) 2021 baichao All rights reserved.
*
*   檔名稱:emptyClassSize.cpp
*   創 建 者:baichao
*   建立日期:2021年02月03日
*   描    述:
*
================================================================*/

#include <iostream>

struct base1{};
class base2{};

int main()
{
    std::cout<<"類base1的長度為:"<<sizeof(base1)<<std::endl;
    std::cout<<"結構體base2的長度為:"<<sizeof(base2)<<std::endl;
    return 0;
}

執行結果:

空類或者空結構體佔1個位元組,因為c++要求每個例項在記憶體中都有獨一無二的地址。空類也會被例項化,所以編譯器會給空類隱含的新增一個位元組,這樣空類例項化之後就有了獨一無二的地址了。所以空類的sizeof為1。

2、繼承空類的子類佔用多大空間?

/*================================================================
*   Copyright (C) 2021 baichao All rights reserved.
*
*   檔名稱:emptyClassSize.cpp
*   創 建 者:baichao
*   建立日期:2021年02月03日
*   描    述:
*
================================================================*/

#include <iostream>

struct base1{};
class base2{};

class rbase2:public base2
{
    int a;
};

int main()
{
    std::cout<<"結構體base1的長度為:"<<sizeof(base1)<<std::endl;
    std::cout<<"類base2的長度為:"<<sizeof(base2)<<std::endl;
    std::cout<<"類rbase2的長度為:"<<sizeof(rbase2)<<std::endl;
    return 0;
}

執行結果:

繼承空類的子類所佔空間僅不再包含空類單獨存在時所佔用的一個位元組,因為子類已經有成員變量了。

3、繼承空類的空子類佔用多大空間呢?

/*================================================================
*   Copyright (C) 2021 baichao All rights reserved.
*
*   檔名稱:emptyClassSize.cpp
*   創 建 者:baichao
*   建立日期:2021年02月03日
*   描    述:
*
================================================================*/

#include <iostream>

struct base1{};
class base2{};

class rbase2:public base2
{
    int a;
};

class rbase3:public base2
{
};
int main()
{
    std::cout<<"結構體base1的長度為:"<<sizeof(base1)<<std::endl;
    std::cout<<"類base2的長度為:"<<sizeof(base2)<<std::endl;
    std::cout<<"類rbase2的長度為:"<<sizeof(rbase2)<<std::endl;
    std::cout<<"空子類rbase3的長度為:"<<sizeof(rbase3)<<std::endl;
    return 0;
}

執行結果:

繼承空類的空子類依然只有一個位元組。