偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

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

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

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

靜態(tài)成員變量(static)不占用類實(shí)例的大小,因?yàn)樗鼈兇鎯?chǔ)在全局/靜態(tài)存儲(chǔ)區(qū)。

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

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

對(duì)齊規(guī)則包括:

  • 每個(gè)成員的對(duì)齊要求:由成員自身的類型決定(例如 int 需要 4 字節(jié)對(duì)齊,double 需要 8 字節(jié)對(duì)齊)。
  • 結(jié)構(gòu)體的總對(duì)齊值:由所有成員中最大的對(duì)齊值決定(假如有 int 和 double,則是 double 的 8 字節(jié)對(duì)齊)。
  • 總大小必須是結(jié)構(gòu)體對(duì)齊值的整數(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 手動(dòng)指定對(duì)齊方式,或使用 #pragma pack 修改對(duì)齊規(guī)則(網(wǎng)絡(luò)通訊中經(jīng)常使用1字節(jié)對(duì)齊,為了節(jié)省內(nèi)存還有流量帶寬)

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

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

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

4. 繼承關(guān)系

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

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

5. 空類的大小

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

如果作為基類,可能被優(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)對(duì)齊為4)
}; // 大小=8

class C {
    virtualvoidfoo(){} // 虛函數(shù)指針:8字節(jié)(64位系統(tǒng))
    int x;                // 4字節(jié)
    // 填充4字節(jié)(對(duì)齊到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)成員不計(jì)算在內(nèi)。
  • 對(duì)齊規(guī)則可能導(dǎo)致額外填充。
  • 虛函數(shù)引入虛表指針開銷。
  • 繼承可能增加基類成員和額外信息。
  • 空類最小為 1 字節(jié)。
  • 可以通過 sizeof 運(yùn)算符驗(yàn)證類的大小,或使用 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++基類

2010-01-15 18:35:25

C++的類

2025-05-20 10:00:00

C++命名空間別名代碼

2023-02-08 07:05:44

2010-01-28 13:27:12

C++類定義

2018-04-25 07:58:44

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

2010-01-21 13:48:30

C++基類

2018-03-19 09:30:53

剖析固態(tài)硬盤

2024-02-05 21:07:51

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

2023-08-02 08:54:58

Java弱引用鏈表

2015-10-27 10:06:16

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

2010-04-22 23:18:59

負(fù)載均衡方案

2021-12-15 06:28:23

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

2023-12-04 11:02:53

C++空類

2010-01-18 18:04:28

靜態(tài)成員

2025-05-23 08:15:00

C++constexpr字面類型
點(diǎn)贊
收藏

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