国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++結(jié)構(gòu)體內(nèi)幕揭秘:sizeof之謎與內(nèi)存布局探秘

這篇具有很好參考價值的文章主要介紹了C++結(jié)構(gòu)體內(nèi)幕揭秘:sizeof之謎與內(nèi)存布局探秘。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

C++結(jié)構(gòu)體內(nèi)幕揭秘:sizeof之謎與內(nèi)存布局探秘

?

概述:C++結(jié)構(gòu)體的`sizeof`不總是等于每個成員的`sizeof`之和,因?yàn)閷R和填充影響了內(nèi)存布局。未對齊的結(jié)構(gòu)體可能存在間隙,而對齊的結(jié)構(gòu)體會插入填充以保持對齊。通過示例展示了結(jié)構(gòu)體的內(nèi)存對齊和填充,以及如何使用模板元編程打印結(jié)構(gòu)體成員的偏移量,深入理解內(nèi)存布局。

在C++中,結(jié)構(gòu)體的sizeof并不總是等于每個成員的sizeof之和,這是由于對齊和填充的影響。編譯器為了提高內(nèi)存訪問速度,通常會在結(jié)構(gòu)體成員之間插入一些填充字節(jié)以對齊數(shù)據(jù)。

基礎(chǔ)功能:

示例源代碼:

#include <iostream>

// 未進(jìn)行對齊的結(jié)構(gòu)體
struct WithoutPadding {
    char a;    // 1 字節(jié)
    int b;     // 4 字節(jié)
    char c;    // 1 字節(jié)
};

// 進(jìn)行對齊的結(jié)構(gòu)體
struct WithPadding {
    char a;    // 1 字節(jié)
    char padding[3];  // 對齊填充 3 字節(jié)
    int b;     // 4 字節(jié)
    char c;    // 1 字節(jié)
};

int main() {
    std::cout << "WithoutPadding 大?。? << sizeof(WithoutPadding) << std::endl;
    std::cout << "WithPadding 大小:" << sizeof(WithPadding) << std::endl;

    return 0;
}

在這個示例中,WithoutPadding?結(jié)構(gòu)體的大小是 6 字節(jié)(1 + 4 + 1),而WithPadding?結(jié)構(gòu)體的大小是 12 字節(jié)(1 + 3(填充)+ 4 + 1)。這是因?yàn)榫幾g器為了對齊int類型的成員b,在其前面插入了3字節(jié)的填充。

高級功能:

示例源代碼:

#include <iostream>
#include <type_traits>

template <typename T>
void PrintOffsets() {
    std::cout << "Offsets for " << typeid(T).name() << ":" << std::endl;

    size_t offset = 0;
    size_t size = sizeof(T);

    // 使用模板元編程逐個打印成員的偏移量
    // 對于 C++17,可以使用 std::is_standard_layout<T> 確保是標(biāo)準(zhǔn)布局類型
    if constexpr (std::is_standard_layout<T>::value) {
        while (offset < size) {
            std::cout << "  Offset of member at index " << offset << ": " << offsetof(T, offset) << std::endl;
            offset++;
        }
    } else {
        std::cout << "  Not a standard layout type." << std::endl;
    }

    std::cout << std::endl;
}

struct ExampleStruct {
    char a;    // 1 字節(jié)
    int b;     // 4 字節(jié)
    char c;    // 1 字節(jié)
};

int main() {
    PrintOffsets<ExampleStruct>();

    return 0;
}

在這個示例中,PrintOffsets?函數(shù)使用模板元編程逐個打印結(jié)構(gòu)體成員的偏移量。ExampleStruct?結(jié)構(gòu)體包含了對齊填充,通過offsetof宏可以獲取每個成員的偏移量。這有助于理解結(jié)構(gòu)體內(nèi)存布局的細(xì)節(jié)。

通過這兩個示例,展示了結(jié)構(gòu)體大小不等于成員sizeof之和的原因,以及如何使用模板元編程逐個打印結(jié)構(gòu)體成員的偏移量。這些知識有助于理解內(nèi)存對齊和結(jié)構(gòu)體內(nèi)存布局。

?

C++結(jié)構(gòu)體內(nèi)幕揭秘:sizeof之謎與內(nèi)存布局探秘文章來源地址http://www.zghlxwxcb.cn/news/detail-842590.html

到了這里,關(guān)于C++結(jié)構(gòu)體內(nèi)幕揭秘:sizeof之謎與內(nèi)存布局探秘的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++內(nèi)存分配揭秘:new操作符::operator new和Placement new的區(qū)別

    C++內(nèi)存分配揭秘:new操作符::operator new和Placement new的區(qū)別

    ? 在 C++ 中, new ?操作符、 ::operator new ?和 placement new 是用于動態(tài)內(nèi)存分配的工具,但它們有不同的用法和行為。以下是它們的區(qū)別和用法的詳細(xì)實(shí)例: new ?操作符用于在堆上動態(tài)分配內(nèi)存,并調(diào)用對象的構(gòu)造函數(shù)初始化對象。 ::operator new ?是 C++ 中的全局函數(shù),用于分配內(nèi)

    2024年01月18日
    瀏覽(42)
  • Python 內(nèi)幕揭秘:深度刨析 Windows 系統(tǒng)下的 os.path.join()

    項(xiàng)目 描述 Python 官方文檔 https://docs.python.org/zh-cn/3/ 搜索引擎 Google 、Bing CPython 3.6 解釋器源碼 官方下載頁面 項(xiàng)目 描述 Windows 操作系統(tǒng) Windows 10 專業(yè)版 類 Unix 操作系統(tǒng) Kali Linux 2023-04-18 PyCharm 2023.1 (Professional Edition) Python 3.10.6 os.path 模塊是 Python 標(biāo)準(zhǔn)庫中的一個模塊,用于處理與

    2024年02月09日
    瀏覽(28)
  • 《WebKit 技術(shù)內(nèi)幕》之六(1): CSS解釋器和樣式布局

    《WebKit 技術(shù)內(nèi)幕》之六(1): CSS解釋器和樣式布局

    《WebKit 技術(shù)內(nèi)幕》之六(1):CSS解釋器和樣式布局 ????????CSS解釋器和規(guī)則匹配處于DOM樹建立之后,RenderObject樹之前,CSS解釋器解釋后的結(jié)果會保存起來,然后RenderObject樹基于該結(jié)果來進(jìn)行規(guī)范匹配和布局計(jì)算。當(dāng)網(wǎng)頁有用戶交互或者動畫等動作的時候,通過CSSOM等技術(shù)

    2024年01月22日
    瀏覽(45)
  • 《WebKit 技術(shù)內(nèi)幕》之六(3): CSS解釋器和樣式布局

    《WebKit 技術(shù)內(nèi)幕》之六(3): CSS解釋器和樣式布局

    3.1 基礎(chǔ) ????????當(dāng)WebKit創(chuàng)建RenderObject對象之后,每個對象是不知道自己的位置、大小等信息的,WebKit根據(jù)框模型來計(jì)算它們的位置、大小等信息的過程稱為布局計(jì)算(或者稱為排版)。 ????????圖描述了這一過程中涉及的主要WebKit類。第5章描述過Frame類,用于表示網(wǎng)

    2024年01月22日
    瀏覽(15)
  • 用Visual Studio 2022的.map文件來查看C++變量在內(nèi)存中的布局情況

    代碼1 上述代碼在Win10 X64,MSVC Release模式下編譯,編譯得到的二進(jìn)制文件大小為 15KB 左右。 代碼2 上述代碼在Win10 X64,MSVC Release模式下編譯,編譯得到的二進(jìn)制文件大小為 15KB 左右。 代碼3 上述代碼在Win10 X64,MSVC Release模式下編譯,編譯得到的二進(jìn)制文件大小為 143KB 左右。

    2024年02月10日
    瀏覽(23)
  • 解密數(shù)據(jù)之謎:算法與數(shù)據(jù)結(jié)構(gòu)的奇妙聯(lián)動

    算法和數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)科學(xué)中非常重要的兩個概念。它們是解決問題和處理數(shù)據(jù)的關(guān)鍵工具。讓我為您介紹一下算法和數(shù)據(jù)結(jié)構(gòu)的基本概念。 算法: 算法是一系列定義良好的操作步驟,用于解決特定問題或執(zhí)行特定任務(wù)。算法可以用來執(zhí)行各種任務(wù),例如搜索、排序、優(yōu)

    2024年01月24日
    瀏覽(15)
  • C++入門學(xué)習(xí)(八)sizeof關(guān)鍵字

    C++入門學(xué)習(xí)(八)sizeof關(guān)鍵字

    sizeof ? 是 C 和 C++ 中的一個運(yùn)算符,用于確定特定類型或?qū)ο蟮膬?nèi)存大?。ㄒ宰止?jié)為單位)。 1、查看數(shù)據(jù)類型占據(jù)內(nèi)存大小 2、確定數(shù)組大小 3、確定結(jié)構(gòu)體大小

    2024年01月21日
    瀏覽(17)
  • 【C++】sizeof()、size()、length()的用法及區(qū)別

    在c++中,length()只是用來獲取字符串的長度。在獲取字符串長度的時候size()和length()函數(shù)作用相同。 size函數(shù)除了可以獲取字符串長度外,還可以獲取vector類型的長度。 在c++中,sizeof()用于獲取數(shù)據(jù)類型或者變量所占內(nèi)存空間的大小。可以通過sizeof計(jì)算獲取數(shù)組元素個數(shù)。

    2024年02月14日
    瀏覽(51)
  • C++中sizeof()、size()、strlen()、length()詳解

    1、size 是一個 函數(shù) ,它是在程序運(yùn)行時才會計(jì)算, 用來求數(shù)組或容器中元素的個數(shù) 。 在字符串string中它與length的作用相同,只是length只能應(yīng)用于string中,而不能應(yīng)用于STL的容器中 2、sizeof 為 運(yùn)算符 , 其結(jié)果是求對應(yīng)參數(shù)的字節(jié)大小 ,它的值是在編譯的時候就計(jì)算完成了

    2024年04月16日
    瀏覽(18)
  • C++面試八股文:了解sizeof操作符嗎?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第10面: 面試官:了解 sizeof 操作符嗎? 二師兄:略微了解(不就是求大小的嘛。。) 面試官:請講以下如何使用 sizeof ? 二師兄: sizeof 主要是求變量或者類型的大小。直接使用 sizeof(type) 或 sizeof(var) 即可。 面試官:嗯。 s

    2024年02月08日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包