gpt4 book ai didi

c++ - 共享库 (libNNN.so) 是否/应该共享常量数据?

转载 作者:IT王子 更新时间:2023-10-29 01:17:51 27 4
gpt4 key购买 nike

有一个与此类似的问题,但没有针对 linux 系统的静态、const 数据(只读数据)的答案。是这样的情况:系统上的许多程序正在使用共享库。那个共享库有大量的常量数据。对于链接到(和使用)共享库的每个进程,该 const 数据是否会在系统内存中复制?我理解(或者我认为)共享库的大小在“高”级别上被计算在内,但是 在幕后 Linux 不会换出可执行部分的重复拷贝。对于静态(命名空间级别)const 数据也是如此吗?

最佳答案

如果共享对象 libNNN.so 在只读段中有数据(例如来自 .rodata.text 部分),那么该段是mmap - 通过 dlopenld.so 使用 MAP_SHARED 编辑,所以不同的进程(加载 libNNN.so)使用它只读数据确实共享包含它的物理 RAM。

静态或全局读写数据进入MAP_PRIVATE 读写mmap 段(来自.bss.data 部分)所以每个进程都有自己的(仍然是写时复制)。

使用 objdump 找出 libNNN.so 中有哪些段

使用pmap/proc/1234/maps了解pid 1234进程的内存映射。(从应用程序内部,顺序读取/proc/self/maps 如果需要,或者 /proc/self/statm 如果你想测量)。

请注意,C 中的 const 内容通常进入 .rodata,但对于 C++ 构造的数据,情况不再如此

关于c++ - 共享库 (libNNN.so) 是否/应该共享常量数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9592399/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com