成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++ 高頻面試:類的大小由什么因素決定?

開發(fā)
在 C++中,類(或結(jié)構(gòu)體)的大小首先由其非靜態(tài)數(shù)據(jù)成員的總大小決定,還有內(nèi)存對齊、虛函數(shù)等。

在 C++中,類(或結(jié)構(gòu)體)的大小主要由以下幾個因素決定:

1. 非靜態(tài)成員變量

類的大小首先由其非靜態(tài)數(shù)據(jù)成員的總大小決定。

成員變量的排列順序和類型直接影響內(nèi)存布局(可能因?qū)R填充而增大)。

靜態(tài)成員變量(static)不占用類實例的大小,因為它們存儲在全局/靜態(tài)存儲區(qū)。

2. 內(nèi)存對齊(Alignment Padding)

為了滿足硬件對齊要求,編譯器可能在成員之間或末尾插入填充字節(jié)(Padding)。

對齊規(guī)則包括:

  • 每個成員的對齊要求:由成員自身的類型決定(例如 int 需要 4 字節(jié)對齊,double 需要 8 字節(jié)對齊)。
  • 結(jié)構(gòu)體的總對齊值:由所有成員中最大的對齊值決定(假如有 int 和 double,則是 double 的 8 字節(jié)對齊)。
  • 總大小必須是結(jié)構(gòu)體對齊值的整數(shù)倍(即 8 的倍數(shù))。

例如:

struct A
{
double a;
int b;
int c;
}
sizeof(A) = 16

大部分編譯器輸出都是 16。

把順序換一下:

struct A
{
int b;
double a;
int c;
}
sizeof(A) = 24

大部分編譯器輸出是 24。

可通過 alignas 手動指定對齊方式,或使用 #pragma pack 修改對齊規(guī)則(網(wǎng)絡(luò)通訊中經(jīng)常使用1字節(jié)對齊,為了節(jié)省內(nèi)存還有流量帶寬)

3. 虛函數(shù)(動態(tài)多態(tài))

如果類包含虛函數(shù),編譯器會為其添加一個虛函數(shù)表指針(vptr),通常占用 sizeof(void*)(32 位系統(tǒng)為 4 字節(jié),64 位為 8 字節(jié))。

虛繼承(virtual 繼承)可能引入額外的開銷(如虛基類指針)。

4. 繼承關(guān)系

派生類的大小包括基類的所有非靜態(tài)成員(可能因繼承方式不同而調(diào)整)。

多重繼承一般會導(dǎo)致多個虛表指針(每個基類獨立)。

5. 空類的大小

空類(無成員、無虛函數(shù))的大小通常為 1 字節(jié),用于確保不同實例有唯一地址。

如果作為基類,可能被優(yōu)化為 0 字節(jié)(空基類優(yōu)化,EBCO)。

6. 編譯器優(yōu)化

某些編譯器可能合并填充區(qū)域或優(yōu)化布局(如 -O3 下的優(yōu)化)。

C++11 的 final 或 override 等關(guān)鍵字不影響大小。

示例代碼:

#include <iostream>
usingnamespace std;

class A {}; // 空類,大小=1

class B {
    int x;      // 4字節(jié)
    char c;     // 1字節(jié)
    // 填充3字節(jié)(假設(shè)默認(rèn)對齊為4)
}; // 大小=8

class C {
    virtualvoidfoo(){} // 虛函數(shù)指針:8字節(jié)(64位系統(tǒng))
    int x;                // 4字節(jié)
    // 填充4字節(jié)(對齊到8)
}; // 大小=16

int main(){
    cout << "A: " << sizeof(A) << endl; // 1
    cout << "B: " << sizeof(B) << endl; // 8
    cout << "C: " << sizeof(C) << endl; // 16
    return0;
}

總結(jié)

  • 成員變量是主要因素,靜態(tài)成員不計算在內(nèi)。
  • 對齊規(guī)則可能導(dǎo)致額外填充。
  • 虛函數(shù)引入虛表指針開銷。
  • 繼承可能增加基類成員和額外信息。
  • 空類最小為 1 字節(jié)。
  • 可以通過 sizeof 運算符驗證類的大小,或使用 offsetof 宏檢查成員偏移量。
責(zé)任編輯:趙寧寧 來源: CppPlayer
相關(guān)推薦

2010-03-19 15:53:03

交換機(jī)

2010-03-05 15:02:27

Android手機(jī)操作

2010-03-16 15:46:23

核心交換機(jī)

2009-08-25 14:42:41

由C++轉(zhuǎn)向C#

2010-01-21 13:33:44

C++基類

2023-02-08 07:05:44

2010-01-15 18:35:25

C++的類

2025-05-20 10:00:00

C++命名空間別名代碼

2010-01-28 13:27:12

C++類定義

2018-03-19 09:30:53

剖析固態(tài)硬盤

2018-04-25 07:58:44

物聯(lián)網(wǎng)項目物聯(lián)網(wǎng)智能化

2010-01-21 13:48:30

C++基類

2024-02-05 21:07:51

C++內(nèi)存編程語言

2023-08-02 08:54:58

Java弱引用鏈表

2010-04-22 23:18:59

負(fù)載均衡方案

2021-12-15 06:28:23

物聯(lián)網(wǎng)項目物聯(lián)網(wǎng)IOT

2015-10-27 10:06:16

因素數(shù)據(jù)復(fù)雜

2023-12-04 11:02:53

C++空類

2010-01-18 18:04:28

靜態(tài)成員

2025-05-23 08:15:00

C++constexpr字面類型
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: h片在线看| 亚洲日本视频 | 亚洲精品第一国产综合野 | 日韩国产中文字幕 | 欧美看片| 狠狠干网 | 成人不卡视频 | 国产免费拔擦拔擦8x高清 | 国产日韩欧美 | 草久久| 久久成人精品视频 | 日韩在线中文字幕 | 亚洲精品99 | 新疆少妇videos高潮 | 欧美成人a | 久久久精品网 | 91传媒在线播放 | 精品久久久久久亚洲精品 | 91免费福利在线 | 在线观看亚 | 亚洲一区二区三区四区av | 在线一区视频 | 91看片在线观看 | 亚洲精品欧美一区二区三区 | 韩日一区 | 久久久精品一区二区三区 | 国产一区二区三区高清 | 二区在线视频 | 97久久精品午夜一区二区 | 欧美一级片在线观看 | 国产精品一级 | 欧美成人精品欧美一级 | 欧美日韩一区在线观看 | 成人一区二 | 国产一区二区精华 | 国产成人精品久久二区二区91 | 久久精品国产99国产精品 | 欧美一区二区在线 | 中文字幕视频一区 | av天天看| 午夜精品久久 |