首页 > 系统相关 >c++打印类的内存布局

c++打印类的内存布局

时间:2023-07-24 13:46:30浏览次数:44  
标签:打印 c++ class +--- A2 内存 base public size

内存布局

  1. 默认32位编译下,4字节对齐
  2. 有虚函数情况下会在内存一开始多一个虚表指针
  3. 普通函数不占内存空间
  4. 静态成员不占内存空间

1. 通过cl命令输出hello.cpp中的类A的内存布局测试

# 输出指定类型的内存布局
cl hello.cpp /d1reportSingleClassLayoutA

# 输出所有类型的内存布局
cl hello.cpp /d1reportAllClassLayout
class A {
public:
    char x;
    int y;
    bool z;
};

1.1 内存布局

class A size(12):
        +---
 0      | x
        | <alignment member> (size=3)
 4      | y
 8      | z
        | <alignment member> (size=3)
        +---

2. 虚函数/虚继承内存布局测试

class A {
public:
    virtual void foo() = 0;
    void bar() {};
    char x;
    int y;
    bool z;
};

class B : public A {
public:
    virtual void foo() override{};
    void bar() {};
    float b;
};

class C: virtual A {
public:
    virtual void foo() override {};
    void bar() {};
    double c;
    static bool c1;
};

2.1 内存布局

class A size(16):
        +---
 0      | {vfptr}
 4      | x
        | <alignment member> (size=3)
 8      | y
12      | z
        | <alignment member> (size=3)
        +---

A::$vftable@:
        | &A_meta
        |  0
 0      | &A::foo

A::foo this adjustor: 0

class B size(20):
        +---
 0      | +--- (base class A)
 0      | | {vfptr}
 4      | | x
        | | <alignment member> (size=3)
 8      | | y
12      | | z
        | | <alignment member> (size=3)
        | +---
16      | b
        +---

B::$vftable@:
        | &B_meta
        |  0
 0      | &B::foo

B::foo this adjustor: 0

class C size(32):
        +---
 0      | {vbptr}
 8      | c
        +---
        +--- (virtual base A)
16      | {vfptr}
20      | x
        | <alignment member> (size=3)
24      | y
28      | z
        | <alignment member> (size=3)
        +---

C::$vbtable@:
 0      | 0
 1      | 16 (Cd(C+0)A)

C::$vftable@:
        | -16
 0      | &C::foo
  1. 菱形继承内存布局测试
class A1 {
public:
    int a;
};

class B1 : public A1 {
public:
    int b;
};

class C1 : public A1 {
public:
    int c;
};

class D1 : public B1, public C1 {
public:
    int d;
};

3.1 内存布局

class A1        size(4):
        +---
 0      | a
        +---

class B1        size(8):
        +---
 0      | +--- (base class A1)
 0      | | a
        | +---
 4      | b
        +---

class C1        size(8):
        +---
 0      | +--- (base class A1)
 0      | | a
        | +---
 4      | c
        +---

class D1        size(20):
        +---
 0      | +--- (base class B1)
 0      | | +--- (base class A1)
 0      | | | a
        | | +---
 4      | | b
        | +---
 8      | +--- (base class C1)
 8      | | +--- (base class A1)
 8      | | | a
        | | +---
12      | | c
        | +---
16      | d
        +---

4.1 虚菱形继承测试

class A2 {
public:
    int a;
};

class B2 : virtual public A2 {
public:
    int b;
};

class C2 : virtual public A2 {
public:
    int c;
};

class D2 : public B2, public C2 {
public:
    int d;
};

4.2 内存布局

class A2        size(4):
        +---
 0      | a
        +---

class B2        size(12):
        +---
 0      | {vbptr}
 4      | b
        +---
        +--- (virtual base A2)
 8      | a
        +---

B2::$vbtable@:
 0      | 0
 1      | 8 (B2d(B2+0)A2)
vbi:       class  offset o.vbptr  o.vbte fVtorDisp
              A2       8       0       4 0

class C2        size(12):
        +---
 0      | {vbptr}
 4      | c
        +---
        +--- (virtual base A2)
 8      | a
        +---

C2::$vbtable@:
 0      | 0
 1      | 8 (C2d(C2+0)A2)
vbi:       class  offset o.vbptr  o.vbte fVtorDisp
              A2       8       0       4 0

class D2        size(24):
        +---
 0      | +--- (base class B2)
 0      | | {vbptr}
 4      | | b
        | +---
 8      | +--- (base class C2)
 8      | | {vbptr}
12      | | c
        | +---
16      | d
        +---
        +--- (virtual base A2)
20      | a
        +---

D2::$vbtable@B2@:
 0      | 0
 1      | 20 (D2d(B2+0)A2)

D2::$vbtable@C2@:
 0      | 0
 1      | 12 (D2d(C2+0)A2)
vbi:       class  offset o.vbptr  o.vbte fVtorDisp
              A2      20       0       4 0

参考

https://www.cnblogs.com/zzqcn/p/4742295.html

标签:打印,c++,class,+---,A2,内存,base,public,size
From: https://www.cnblogs.com/BuzzWeek/p/17576987.html

相关文章

  • 在控制台中打印出一个半菱形python
    在控制台中打印半菱形的Python作为一名经验丰富的开发者,我将教会你如何在控制台中打印出一个半菱形的图案。以下是整个实现过程的步骤:步骤描述步骤1获取用户输入的行数步骤2打印上半部分的菱形步骤3打印下半部分的菱形现在,让我为你解释每一步需要做什么,并......
  • 记录windows、vs2019、c++、cuda环境配置
    原文链接:   (45条消息)CUDA+Windows+VS环境配置_cudavs_哈哈哈哈哈嗝哈哈哈的博客-CSDN博客            VS2019--c++CUDA环境配置与编程实例-知乎(zhihu.com)测试代码:.cu文件中:#include"stdio.h"#include<cuda_runtime.h>#include<devi......
  • android sdk 内存mac
    如何实现AndroidSDK内存mac作为一名经验丰富的开发者,我很高兴帮助你了解如何实现AndroidSDK内存mac。在开始之前,我们先来了解一下整个过程的流程。流程下面是实现AndroidSDK内存mac的步骤:步骤描述1.安装AndroidStudio2.创建一个新的Android项目3......
  • android ndk内存泄露检测与定位
    AndroidNDK内存泄漏检测与定位简介在Android开发中,经常会遇到内存泄漏的问题。而使用NDK进行开发时,由于与底层交互更加频繁,内存泄漏问题也更易发生。本文将介绍如何在AndroidNDK中进行内存泄漏检测与定位的流程和具体实现方法。流程概述以下是进行AndroidNDK内存泄漏检测与......
  • android studio打印日志过长显示补全
    AndroidStudio打印日志过长显示补全实现步骤作为一名经验丰富的开发者,我将向你介绍如何在AndroidStudio中实现打印日志过长时的显示补全功能。这个功能可以帮助你更方便地查看和调试长日志信息。实现步骤下面是整个实现过程的步骤概览。我们将逐步进行操作,确保你能够完全了解......
  • Delphi7 TClientDataSet作为内存数据集合使用
    IDE:Delphi7使用TClientDataSet控件在Delphi中保存内存数据集合(相当于Java中的List<Map>),代码片段:procedureTMainForm.btnExportClick(Sender:TObject);tmpCds:TClientDataSet;tmpStr:string;begin//TClientDataSet作为内存数据集合使用//*********************......
  • PerfView 洞察C#托管堆内存 "黑洞现象"
    一:背景1.讲故事首先声明的是这个黑洞是我定义的术语,它是用来表示内存吞噬的一种现象,何为内存吞噬,我们来看一张图。从上面的卦象图来看,GCHeap的Allocated=852M和Committed=16.6G,它们的差值就是分配缓冲区=16G,缓冲区的好处就是用空间换时间,弊端就是会实实在在的侵......
  • C++内存分区模型
    C++内存分区模型在执行C++程序的过程中,内存大致分为四个区域:栈区(Stack):用于实现函数调用。由编译器自动分配释放,存放函数的参数值和局部变量等堆区(Heap):用于存放动态分配的变量。由程序员动态分配和释放,使用new和delete操作符全局/静态存储区(DataSegment&BSSSegm......
  • pycharm运行时提示内存不足解决办法
    然后把下边的数据替换:原始数据:-Xms128m-Xmx1536m-XX:ReservedCodeCacheSize=512m-XX:+IgnoreUnrecognizedVMOptions-XX:+UseG1GC-XX:SoftRefLRUPolicyMSPerMB=50-XX:CICompilerCount=2-XX:+HeapDumpOnOutOfMemoryError-XX:-OmitStackTraceInFastThrow-ea-Dsun.io.us......
  • iptables防火墙调试,想打印个日志就这么难
    背景怎么会讲这个话题,这个说来真的长了。但是,长话短说,也是可以的。我前面的文章提到,线上的服务用了c3p0数据库连接池,会偶发连接泄露问题,而分析到最后,又怀疑是db侧主动关闭连接,或者是服务所在机器和db之间有防火墙,防火墙主动关闭了连接。导致我们这边socket看着还健康,实际在对端......