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

C++中sizeof運(yùn)算符全面詳解和代碼示例

 更新時(shí)間:2025年07月31日 09:18:50   作者:點(diǎn)云SLAM  
sizeof是C++中的一個(gè)編譯時(shí)運(yùn)算符,用于獲取對(duì)象或類型所占的字節(jié)數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

sizeof 是 C++ 中的一個(gè)編譯時(shí)運(yùn)算符,用于獲取對(duì)象或類型所占的字節(jié)數(shù)(以 size_t 返回)。它是掌握底層內(nèi)存模型、結(jié)構(gòu)體對(duì)齊、數(shù)組大小計(jì)算等的重要工具。

1. 基本語(yǔ)法

sizeof(type)      // 獲取類型的大小
sizeof expression // 獲取表達(dá)式結(jié)果的大小

2. 返回值類型

  • sizeof 返回類型是 std::size_t(定義在 <cstddef> 中),是一個(gè)無(wú)符號(hào)整型,足以容納系統(tǒng)中對(duì)象的最大可能大小。

3. 示例代碼一覽

#include <iostream>
#include <cstddef>

int main() {
    int a = 5;
    double b = 3.14;
    int arr[10];

    std::cout << "sizeof(int): " << sizeof(int) << "\n";
    std::cout << "sizeof(a): " << sizeof(a) << "\n";
    std::cout << "sizeof(b): " << sizeof b << "\n";  // 可省略括號(hào)
    std::cout << "sizeof(arr): " << sizeof(arr) << "\n";
    std::cout << "Number of elements in arr: " << sizeof(arr) / sizeof(arr[0]) << "\n";

    return 0;
}

4. 結(jié)構(gòu)體對(duì)齊示例(含填充字節(jié))

#include <iostream>

struct A {
    char c;     // 1 byte
    int i;      // 4 bytes
};

int main() {
    std::cout << "sizeof(char): " << sizeof(char) << "\n";
    std::cout << "sizeof(int): " << sizeof(int) << "\n";
    std::cout << "sizeof(A): " << sizeof(A) << "\n";  // likely 8 due to padding
}

結(jié)構(gòu)體 A 實(shí)際大小常常為 8,而不是 5,這是因?yàn)榫幾g器插入了填充字節(jié)以保證成員變量對(duì)齊(稱為結(jié)構(gòu)體對(duì)齊或 padding)。

5. 指針和數(shù)組的區(qū)別

int arr[10];
int* p = arr;

std::cout << "sizeof(arr): " << sizeof(arr) << "\n";     // 10 * sizeof(int)
std::cout << "sizeof(p): " << sizeof(p) << "\n";         // 指針大小,通常是 8(64 位系統(tǒng))

6. 類的sizeof示例(含虛函數(shù)、繼承)

#include <iostream>

class Base {
    virtual void foo() {}
};

class Derived : public Base {
    int data;
};

int main() {
    std::cout << "sizeof(Base): " << sizeof(Base) << "\n";      // 有 vptr,通常為 8
    std::cout << "sizeof(Derived): " << sizeof(Derived) << "\n"; // vptr + int + padding
}

7. 注意事項(xiàng)

事項(xiàng)說(shuō)明
sizeof 是編譯時(shí)運(yùn)算除非作用于 VLA(C99 風(fēng)格,C++ 不支持),否則計(jì)算在編譯期完成
對(duì)于類型無(wú)需括號(hào)sizeof expression 中括號(hào)可?。籹izeof(type) 中必須加括號(hào)
數(shù)組退化sizeof(arr) 在函數(shù)參數(shù)中為指針大小,不是數(shù)組總大小
對(duì)動(dòng)態(tài)分配數(shù)組無(wú)效sizeof(new int[10]) 得到的是指針大小,不是數(shù)組大小

8.sizeof與模板配合(常用于靜態(tài)斷言)

template<typename T>
void check_size() {
    static_assert(sizeof(T) <= 8, "Type is too big!");
}

9. C++11 起的alignof

#include <iostream>
#include <type_traits>

struct MyStruct {
    char c;
    double d;
};

int main() {
    std::cout << "sizeof(MyStruct): " << sizeof(MyStruct) << "\n";
    std::cout << "alignof(MyStruct): " << alignof(MyStruct) << "\n";
}

10、綜合示例

下面是一個(gè) 跨平臺(tái)結(jié)構(gòu)體對(duì)齊測(cè)試工具類 的完整示例,功能如下:

  • 顯示結(jié)構(gòu)體每個(gè)成員的偏移量(offsetof);
  • 顯示結(jié)構(gòu)體整體 sizeofalignof
  • 兼容 GCC / Clang / MSVC;
  • 可用于診斷因字節(jié)對(duì)齊(padding)帶來(lái)的內(nèi)存浪費(fèi)。

工具類:StructInspector

功能說(shuō)明:

  • 使用 offsetof 獲取成員偏移;
  • 使用 sizeofalignof 獲取結(jié)構(gòu)體大小和對(duì)齊;
  • 可擴(kuò)展支持任意結(jié)構(gòu)體(通過(guò)宏注冊(cè)成員)。

示例代碼

#include <iostream>
#include <iomanip>
#include <cstddef>
#include <string>
#include <type_traits>

// 通用格式輸出宏
#define PRINT_ALIGN_INFO(T) \
    std::cout << "Struct: " << #T << "\n" \
              << "  Size:    " << sizeof(T) << "\n" \
              << "  Alignof: " << alignof(T) << "\n\n";

// 檢查偏移宏(成員名必須為字符串形式)
#define PRINT_MEMBER_OFFSET(StructType, Member) \
    std::cout << std::setw(20) << #Member << " @ offset: " << offsetof(StructType, Member) << "\n";


// -----------------------------
// 示例結(jié)構(gòu)體
// -----------------------------
struct MyStruct {
    char    c1;
    double  d;
    int     i;
    char    c2;
};

struct PackedStruct {
    char c1;
    char c2;
    int  i;
} __attribute__((packed));  // GCC/Clang 特性(MSVC: use #pragma pack)

#pragma pack(push, 1)
struct MsvcPackedStruct {
    char c1;
    char c2;
    int i;
};
#pragma pack(pop)


// -----------------------------
// 工具函數(shù):打印結(jié)構(gòu)體布局
// -----------------------------
template<typename T>
void InspectStructLayout(const std::string& name) {
    std::cout << "==============================\n";
    std::cout << "Inspecting: " << name << "\n";
    std::cout << "sizeof(" << name << ") = " << sizeof(T) << "\n";
    std::cout << "alignof(" << name << ") = " << alignof(T) << "\n";
    std::cout << "------------------------------\n";
}

// 示例專用模板:打印具體成員偏移
void Inspect_MyStruct() {
    InspectStructLayout<MyStruct>("MyStruct");

    PRINT_MEMBER_OFFSET(MyStruct, c1);
    PRINT_MEMBER_OFFSET(MyStruct, d);
    PRINT_MEMBER_OFFSET(MyStruct, i);
    PRINT_MEMBER_OFFSET(MyStruct, c2);

    std::cout << "\n";
}

void Inspect_PackedStruct() {
    InspectStructLayout<PackedStruct>("PackedStruct");

    PRINT_MEMBER_OFFSET(PackedStruct, c1);
    PRINT_MEMBER_OFFSET(PackedStruct, c2);
    PRINT_MEMBER_OFFSET(PackedStruct, i);

    std::cout << "\n";
}

void Inspect_MsvcPackedStruct() {
    InspectStructLayout<MsvcPackedStruct>("MsvcPackedStruct");

    PRINT_MEMBER_OFFSET(MsvcPackedStruct, c1);
    PRINT_MEMBER_OFFSET(MsvcPackedStruct, c2);
    PRINT_MEMBER_OFFSET(MsvcPackedStruct, i);

    std::cout << "\n";
}

// -----------------------------
// 主程序入口
// -----------------------------
int main() {
    Inspect_MyStruct();
    Inspect_PackedStruct();
    Inspect_MsvcPackedStruct();
    return 0;
}

示例輸出(Linux + GCC)

==============================
Inspecting: MyStruct
sizeof(MyStruct) = 24
alignof(MyStruct) = 8
------------------------------
                 c1 @ offset: 0
                  d @ offset: 8
                  i @ offset: 16
                 c2 @ offset: 20

==============================
Inspecting: PackedStruct
sizeof(PackedStruct) = 6
alignof(PackedStruct) = 1
------------------------------
                 c1 @ offset: 0
                 c2 @ offset: 1
                  i @ offset: 2

==============================
Inspecting: MsvcPackedStruct
sizeof(MsvcPackedStruct) = 6
alignof(MsvcPackedStruct) = 1
------------------------------
                 c1 @ offset: 0
                 c2 @ offset: 1
                  i @ offset: 2

可擴(kuò)展功能

可以封裝為模板工具類,如下:

template<typename T>
struct StructAnalyzer {
    static void inspect(const std::vector<std::string>& member_names, const std::vector<std::size_t>& member_offsets) {
        std::cout << "Sizeof: " << sizeof(T) << ", Alignof: " << alignof(T) << "\n";
        for (size_t i = 0; i < member_names.size(); ++i)
            std::cout << member_names[i] << " @ offset: " << member_offsets[i] << "\n";
    }
};

因?yàn)?C++ 不支持反射,需要手動(dòng)提供成員名與偏移。

小結(jié)

功能實(shí)現(xiàn)
成員偏移計(jì)算offsetof(StructType, member)
結(jié)構(gòu)體大小與對(duì)齊sizeof, alignof
跨平臺(tái)結(jié)構(gòu)體分析支持__attribute__((packed)) / #pragma pack(1)
填充字節(jié)檢查(診斷浪費(fèi))offsetof + sizeof 分析對(duì)比

總結(jié)

用法說(shuō)明
sizeof(type)獲取某個(gè)類型的大小
sizeof(expr)獲取表達(dá)式類型的大小
獲取數(shù)組元素個(gè)數(shù)sizeof(arr) / sizeof(arr[0])
獲取結(jié)構(gòu)體大小(含對(duì)齊)sizeof(Struct)
與模板、static_assert 配合編譯時(shí)類型檢查
指針大小與指向?qū)ο蟠笮o(wú)關(guān)

到此這篇關(guān)于C++中sizeof運(yùn)算符全面詳解和代碼示例的文章就介紹到這了,更多相關(guān)C++ sizeof運(yùn)算符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)字符串分割的實(shí)例

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)字符串分割的實(shí)例

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)字符串分割的實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • C語(yǔ)言容易被忽視的函數(shù)設(shè)計(jì)原則基礎(chǔ)

    C語(yǔ)言容易被忽視的函數(shù)設(shè)計(jì)原則基礎(chǔ)

    C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語(yǔ)言.那么C語(yǔ)言函數(shù)設(shè)計(jì)的一般原則和技巧都是怎樣的呢,下面帶你了解
    2022-04-04
  • 幫VS2019 找回丟失的 SDK問(wèn)題

    幫VS2019 找回丟失的 SDK問(wèn)題

    最近很多朋友向小編求助在機(jī)器上的 vs2019 編譯 C++ 工程報(bào)錯(cuò)問(wèn)題,今天小編給大家分享幫VS2019 找回丟失的 SDK問(wèn)題,感興趣的朋友一起看看吧
    2020-05-05
  • C++圖解單向鏈表類模板和iterator迭代器類模版詳解

    C++圖解單向鏈表類模板和iterator迭代器類模版詳解

    這篇文章主要為大家詳細(xì)介紹了C++圖解單向鏈表類模板和iterator迭代器類模版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • 基于Turbo C(V2.0)編譯錯(cuò)誤信息的詳細(xì)介紹

    基于Turbo C(V2.0)編譯錯(cuò)誤信息的詳細(xì)介紹

    本篇文章對(duì)Turbo C(V2.0)編譯的錯(cuò)誤信息進(jìn)行了詳細(xì)的介紹。需要的朋友參考下
    2013-05-05
  • Qt讀寫ini文件的方法詳解(含源碼+注釋)

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

    .ini文件是Initialization?File的縮寫,即初始化文件,下面這篇文章主要給大家介紹了關(guān)于Qt讀寫ini文件(含源碼+注釋)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • C++筆記之std::future的用法小結(jié)

    C++筆記之std::future的用法小結(jié)

    std::future通常由某個(gè)Provider創(chuàng)建,與std::async一起使用,本文主要介紹了C++筆記之std::future的用法小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • C++撲克牌的洗牌發(fā)牌游戲設(shè)計(jì)

    C++撲克牌的洗牌發(fā)牌游戲設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C++撲克牌的洗牌發(fā)牌游戲設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Qt中QPixmap、QImage、QPicture、QBitmap四者區(qū)別詳解

    Qt中QPixmap、QImage、QPicture、QBitmap四者區(qū)別詳解

    Qt 提供了四個(gè)類來(lái)處理圖像數(shù)據(jù):QImage、QPixmap、QBitmap 和 QPicture,本文就詳細(xì)的介紹一下四者區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 詳解C語(yǔ)言中strpbrk()函數(shù)的用法

    詳解C語(yǔ)言中strpbrk()函數(shù)的用法

    這篇文章主要介紹了詳解C語(yǔ)言中strpbrk()函數(shù)的用法,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08

最新評(píng)論