C++对象在内存是怎么布局的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xuelang
V2EX    推广

C++对象在内存是怎么布局的?

  •  
  •   xuelang 2024 年 5 月 11 日 870 次点击
    这是一个创建于 673 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在前面 Bazel 依赖缺失导致的 C++ 进程 coredump 问题分析 这篇文章,因为二进制使用了不同版本的 proto 对象,对象的内存布局不一致导致读、写成员的内存地址错乱,进而导致进程 crash 掉。但是当时并没有展开细聊下面的问题:

    • 对象在内存中是怎么布局的?
    • 成员方法是如何拿到成员变量的地址?

    这些其实涉及 C++ 的对象模型,《深度探索 C++对象模型:Inside the C++ Object Model 》这本书全面聊了这个问题,非常值得一读。不过这本书读起来并不容易,有的内容读过后如果没有加以实践,也很难完全理解。

    于是好好梳理了下,主要结论:

    1. 对象的内存布局是连续的,成员变量按照声明的顺序存储在对象中,编译器会根据类定义计算每个成员变量相对于对象起始地址的偏移量。
    2. 成员方法存储在进程的文本段,不占用对象实例的内存空间,通过 this 指针和偏移量访问成员变量。
    3. 私有成员变量和方法在运行期并没有保护,可以通过地址偏移绕过编译器的限制进行读写,但是不推荐这样做。
    4. 静态成员变量和静态成员方法存储在程序的数据段和代码段,不占用对象实例的内存空间。 继承类的内存布局,编译器一般会把基类的成员变量放在派生类的成员变量之前,使对象模型变得更简单和直观。
    5. 带有虚函数的继承,对象的内存布局中包含虚函数表指针,多态调用通过虚函数表实现。虚函数实现比较复杂,这里只考虑简单的单继承。
    6. 地址空间布局随机化( ASLR )是现代操作系统的安全特性,可以有效防止缓冲区溢出攻击等安全漏洞。GDB 默认禁用 ASLR ,可以通过 set disable-randomization off 命令开启地址空间的随机化。

    完整文章在: 结合实例深入理解 C++ 对象的内存布局

    大家帮忙 review 下~

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1043 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 18:12 PVG 02:12 LAX 11:12 JFK 14:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86