共享库(libNNN.so)共享Const数据吗?

时间:2012-03-06 21:42:57

标签: c++ linux

有一个类似于这个的问题,但没有针对静态, const 数据(只读数据)和linux系统的答案。 情况就是这样: 系统上的许多程序正在使用共享库。该共享库具有大量的const数据。对于链接到(并使用)共享库的每个进程,是否会在系统内存中复制const数据? 我理解(或者我认为)共享库的大小是在“高”级别对其进行计数,但掩盖下的 Linux将不会交换可执行部分的重复副本。这对静态(名称空间级别)const数据也是如此吗?

1 个答案:

答案 0 :(得分:5)

如果共享对象libNNN.so在只读片段中有数据(例如来自.rodata.text部分),则该片段为mmap - 带{ {1}} MAP_SHAREDdlopen所以使用该只读数据的不同进程(加载ld.so)确实共享包含它的物理RAM。

静态或全局读写数据将进入libNNN.so读写MAP_PRIVATE - ed段(来自mmap.bss部分),因此每个进程都有它自己的(仍在写时复制)。

使用.data查找objdump

中的细分受众群

使用libNNN.sopmap了解pid 1234进程的内存映射。(从应用程序内部,如果需要,依次阅读/proc/1234/maps/proc/self/maps你想测量。)

注意到C中的/proc/self/statm事物经常进入const,但是对于C ++构造的数据,情况就不再是这样了