C/C++内存布局

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

1. C 结构体的内存布局

以一个例子来看struct的内存结构


#define NP_FUNC_WRAPPER __attribute__((optimize(0)))

struct StructBody
{
    int first_int_placeholder;
    int second_int_placeholder;
    double third_double_placeholder;
};

class ClassBody
{
    public:

    int first_int_placeholder;
    int second_int_placeholder;
    double third_double_placeholder;
};

class SecondClass
{
    public:
    virtual void function_call(){}

    private:
    int first_int_placeholder;
    int second_int_placeholder;
    double third_double_placeholder;

};

#include <cstdio>

  int main(int argc, char ** argv)
{
    
    int s_struct=  sizeof(StructBody);
    int s_class=  sizeof(ClassBody);
    int s_v_class=  sizeof(SecondClass);
    printf("sizeof(StructBody) = %d, sizeof(ClassBody) = %d, sizeof(SecondClass)=%d\n",
    s_struct, s_class, s_v_class);
    return 0;
}

使用g++编译器(-O3 -std=c++11 -fno-inline-small-functions)产生的汇编代码为:

.LC0:
        .string "sizeof(StructBody) = %d, sizeof(ClassBody) = %d, sizeof(SecondClass)=%d\n"
main:
        sub     rsp, 8
        mov     ecx, 24
        mov     edx, 16
        xor     eax, eax
        mov     esi, 16
        mov     edi, OFFSET FLAT:.LC0
        call    printf
        xor     eax, eax
        add     rsp, 8
        ret

可以看出来,sizeof(StructBody) = 16, 这是因为在64位平台,sizeof(int)=4, sizeof(double)=8

2. C++ 类对象的内存布局

同上,
sizeof(ClassBody) = 16,sizeof(SecondClass)=24,相ClassBody, SecondClass多了8bytes,这是因为SecondClass中有一个virtual function,会在class的开始位置创建一个vtable,本质是一个指针,指向一块内存区域,该区域存放虚函数的地址,因此多了8bytes.

参考:

C++对象在内存中的布局
C++ 对象的内存布局-实验文章来源地址https://www.toymoban.com/news/detail-813445.html

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

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

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

相关文章

  • 对象内存布局与对象头

    在Hotspot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分: 对象头、实例数据、对齐填充。 对象头 在64为系统中,Mark word 占了8个字节,cla ss Pointer 占了8个字节。从jdk1.8开始,存在指针压缩,class Pointer 占4个字节。 jvm默认开启的:-XX:+UserCompressedClassPointers 压缩指针

    2024年02月12日
    浏览(30)
  • C/C++内存布局

    以一个例子来看struct的内存结构 使用g++编译器( -O3 -std=c++11 -fno-inline-small-functions )产生的汇编代码为: 可以看出来,sizeof(StructBody) = 16, 这是因为在64位平台,sizeof(int)=4, sizeof(double)=8 同上, sizeof(ClassBody) = 16,sizeof(SecondClass)=24,相ClassBody, SecondClass多了8bytes,这是因为S

    2024年01月22日
    浏览(23)
  • C语言 内存布局

    预处理-编译-汇编-链接 预处理:头⽂件包含、宏替换、条件编译、删除注释... 编译:主要进⾏词法、语法、语义分析等,检查⽆误后将预处理好的⽂件编译成汇编⽂件... 汇编:将汇编⽂件转换成 ⼆进制⽬标⽂件... 链接:将项⽬中的各个⼆进制⽂件+所需的库+启动代码链接成

    2024年02月09日
    浏览(22)
  • C++对象封装后的内存布局

    在C语言中,数据和数据的处理操作(函数)是分开声明的,在语言层面并没有支持数据和函数的内在关联性,我们称之为过程式编程范式或者程序性编程范式。C++兼容了C语言,当然也支持这种编程范式。但C++更主要的特点在支持基于对象(object-based, OB)和面向对象(object

    2024年04月15日
    浏览(30)
  • 一看就懂的java对象内存布局

    前言 Java 中一切皆对象,同时对象也是 Java 编程中接触最多的概念,深入理解 Java 对象能够更帮助我们深入地掌握 Java 技术栈。在这篇文章里,我们将从内存的视角,带你深入理解 Java 对象在虚拟机中的表现形式。 学习路线图: 1. 对象在哪里分配? 在 Java 虚拟机中,Java 堆

    2024年02月05日
    浏览(33)
  • 【C/C++】栈内存布局,堆栈内存被破坏的现象及可能原因

    栈内存是一种由编译器自动分配和释放的内存区域,用于存储函数调用时的局部变量、函数参数、返回地址等信息。栈内存的分配和释放是由程序自动完成的,通常不需要手动管理。栈内存的布局通常是从高地址向低地址生长,每个函数调用时都会在栈上分配一段空间,称为

    2024年02月11日
    浏览(31)
  • JVM面试题-JVM对象的创建过程、内存分配、内存布局、访问定位等问题详解

    内存分配的两种方式 指针碰撞 适用场合:堆内存 规整 (即没有内存碎片)的情况下。 原理:用过的内存全部整合到一边,没有用过的内存放在另一边,中间有一个分界指针,只需要向着没用过的内存方向将该指针移动对象内存大小位置即可。 使用该分配方式的GC收集器:

    2024年02月08日
    浏览(40)
  • 深入理解Java虚拟机jvm-对象的内存布局

    在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例 数据(Instance Data)和对齐填充(Padding)。 HotSpot虚拟机对象的对象头部分包括两类信息。第一类是用于存储对象自身的运行时数据,如哈 希码(HashCode)、GC分代年龄、锁状态标志、

    2024年02月09日
    浏览(44)
  • 【JUC进阶】03. Java对象头和内存布局

    为了后面更好的学习锁优化以及运作过程,需要我们对HotSpot虚拟机的Java对象内存布局有一定的了解,也作为技术储备。 在HotSpot虚拟机中,对象在堆内存中存储的布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)。 而数组对象和普通对

    2024年02月10日
    浏览(32)
  • 通过读取字节内容分析对象在内存中的布局

    在《如何计算一个实例占用多少内存?》中我们知道一个值类型或者引用类型的实例在内存中占多少字节。如果我们知道这段连续的字节序列的初始地址,我们就能够将代表该实例的字节内容读取出来。在接下来的内容中,我们将利用一个简单的方法输出指定实例的字节序列

    2024年02月08日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包