C++结构体内幕揭秘:sizeof之谜与内存布局探秘

这篇具有很好参考价值的文章主要介绍了C++结构体内幕揭秘:sizeof之谜与内存布局探秘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++结构体内幕揭秘:sizeof之谜与内存布局探秘

 

概述:C++结构体的`sizeof`不总是等于每个成员的`sizeof`之和,因为对齐和填充影响了内存布局。未对齐的结构体可能存在间隙,而对齐的结构体会插入填充以保持对齐。通过示例展示了结构体的内存对齐和填充,以及如何使用模板元编程打印结构体成员的偏移量,深入理解内存布局。

在C++中,结构体的sizeof并不总是等于每个成员的sizeof之和,这是由于对齐和填充的影响。编译器为了提高内存访问速度,通常会在结构体成员之间插入一些填充字节以对齐数据。

基础功能:

示例源代码:

#include <iostream>

// 未进行对齐的结构体
struct WithoutPadding {
    char a;    // 1 字节
    int b;     // 4 字节
    char c;    // 1 字节
};

// 进行对齐的结构体
struct WithPadding {
    char a;    // 1 字节
    char padding[3];  // 对齐填充 3 字节
    int b;     // 4 字节
    char c;    // 1 字节
};

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

    return 0;
}

在这个示例中,WithoutPadding 结构体的大小是 6 字节(1 + 4 + 1),而WithPadding 结构体的大小是 12 字节(1 + 3(填充)+ 4 + 1)。这是因为编译器为了对齐int类型的成员b,在其前面插入了3字节的填充。

高级功能:

示例源代码:

#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> 确保是标准布局类型
    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 字节
    int b;     // 4 字节
    char c;    // 1 字节
};

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

    return 0;
}

在这个示例中,PrintOffsets 函数使用模板元编程逐个打印结构体成员的偏移量。ExampleStruct 结构体包含了对齐填充,通过offsetof宏可以获取每个成员的偏移量。这有助于理解结构体内存布局的细节。

通过这两个示例,展示了结构体大小不等于成员sizeof之和的原因,以及如何使用模板元编程逐个打印结构体成员的偏移量。这些知识有助于理解内存对齐和结构体内存布局。

 

C++结构体内幕揭秘:sizeof之谜与内存布局探秘文章来源地址https://www.toymoban.com/news/detail-842590.html

到了这里,关于C++结构体内幕揭秘:sizeof之谜与内存布局探秘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++内存分配揭秘:new操作符::operator new和Placement new的区别

      在 C++ 中, new  操作符、 ::operator new  和 placement new 是用于动态内存分配的工具,但它们有不同的用法和行为。以下是它们的区别和用法的详细实例: new  操作符用于在堆上动态分配内存,并调用对象的构造函数初始化对象。 ::operator new  是 C++ 中的全局函数,用于分配内

    2024年01月18日
    浏览(28)
  • Python 内幕揭秘:深度刨析 Windows 系统下的 os.path.join()

    项目 描述 Python 官方文档 https://docs.python.org/zh-cn/3/ 搜索引擎 Google 、Bing CPython 3.6 解释器源码 官方下载页面 项目 描述 Windows 操作系统 Windows 10 专业版 类 Unix 操作系统 Kali Linux 2023-04-18 PyCharm 2023.1 (Professional Edition) Python 3.10.6 os.path 模块是 Python 标准库中的一个模块,用于处理与

    2024年02月09日
    浏览(42)
  • 《WebKit 技术内幕》之六(3): CSS解释器和样式布局

    3.1 基础         当WebKit创建RenderObject对象之后,每个对象是不知道自己的位置、大小等信息的,WebKit根据框模型来计算它们的位置、大小等信息的过程称为布局计算(或者称为排版)。         图描述了这一过程中涉及的主要WebKit类。第5章描述过Frame类,用于表示网

    2024年01月22日
    浏览(29)
  • 《WebKit 技术内幕》之六(1): CSS解释器和样式布局

    《WebKit 技术内幕》之六(1):CSS解释器和样式布局         CSS解释器和规则匹配处于DOM树建立之后,RenderObject树之前,CSS解释器解释后的结果会保存起来,然后RenderObject树基于该结果来进行规范匹配和布局计算。当网页有用户交互或者动画等动作的时候,通过CSSOM等技术

    2024年01月22日
    浏览(27)
  • 用Visual Studio 2022的.map文件来查看C++变量在内存中的布局情况

    代码1 上述代码在Win10 X64,MSVC Release模式下编译,编译得到的二进制文件大小为 15KB 左右。 代码2 上述代码在Win10 X64,MSVC Release模式下编译,编译得到的二进制文件大小为 15KB 左右。 代码3 上述代码在Win10 X64,MSVC Release模式下编译,编译得到的二进制文件大小为 143KB 左右。

    2024年02月10日
    浏览(30)
  • 解密数据之谜:算法与数据结构的奇妙联动

    算法和数据结构是计算机科学中非常重要的两个概念。它们是解决问题和处理数据的关键工具。让我为您介绍一下算法和数据结构的基本概念。 算法: 算法是一系列定义良好的操作步骤,用于解决特定问题或执行特定任务。算法可以用来执行各种任务,例如搜索、排序、优

    2024年01月24日
    浏览(29)
  • C++入门学习(八)sizeof关键字

    sizeof   是 C 和 C++ 中的一个运算符,用于确定特定类型或对象的内存大小(以字节为单位)。 1、查看数据类型占据内存大小 2、确定数组大小 3、确定结构体大小

    2024年01月21日
    浏览(29)
  • C++中sizeof()、size()、strlen()、length()详解

    1、size 是一个 函数 ,它是在程序运行时才会计算, 用来求数组或容器中元素的个数 。 在字符串string中它与length的作用相同,只是length只能应用于string中,而不能应用于STL的容器中 2、sizeof 为 运算符 , 其结果是求对应参数的字节大小 ,它的值是在编译的时候就计算完成了

    2024年04月16日
    浏览(30)
  • 【C++】sizeof()、size()、length()的用法及区别

    在c++中,length()只是用来获取字符串的长度。在获取字符串长度的时候size()和length()函数作用相同。 size函数除了可以获取字符串长度外,还可以获取vector类型的长度。 在c++中,sizeof()用于获取数据类型或者变量所占内存空间的大小。可以通过sizeof计算获取数组元素个数。

    2024年02月14日
    浏览(30)
  • C++面试八股文:了解sizeof操作符吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第10面: 面试官:了解 sizeof 操作符吗? 二师兄:略微了解(不就是求大小的嘛。。) 面试官:请讲以下如何使用 sizeof ? 二师兄: sizeof 主要是求变量或者类型的大小。直接使用 sizeof(type) 或 sizeof(var) 即可。 面试官:嗯。 s

    2024年02月08日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包