C++ 共享库(libNNN.so)是否应该共享常量数据?
有一个问题与此类似,但答案并不针对linux系统中的静态常量数据(只读数据)。 情况就是这样: 系统上的许多程序都在使用共享库。那个共享库有大量常量数据。对于链接到(并使用)共享库的每个进程,const数据是否会复制到系统内存中?C++ 共享库(libNNN.so)是否应该共享常量数据?,c++,linux,C++,Linux,有一个问题与此类似,但答案并不针对linux系统中的静态常量数据(只读数据)。 情况就是这样: 系统上的许多程序都在使用共享库。那个共享库有大量常量数据。对于链接到(并使用)共享库的每个进程,const数据是否会复制到系统内存中? 我理解(或者我认为我理解)共享库的大小在一个“高”的级别上被计算在内,但是在幕后Linux不会交换可执行部分的副本。静态(命名空间级别)常量数据也是如此吗?如果共享对象libNNN.so在只读段中包含数据(例如,来自.rodata或.text段),则该段由dlopen
我理解(或者我认为我理解)共享库的大小在一个“高”的级别上被计算在内,但是在幕后Linux不会交换可执行部分的副本。静态(命名空间级别)常量数据也是如此吗?如果共享对象
libNNN.so
在只读段中包含数据(例如,来自.rodata
或.text
段),则该段由dlopen
或ld.so
使用MAP\u共享的so不同的过程进行加密(加载libNNN.so
)使用该只读数据确实共享了包含它的物理RAM
静态或全局读写数据将进入一个MAP\u PRIVATE
read-writemmap
-ed段(从.bss
或.data
段),因此每个进程都有自己的(仍在写入时复制)
使用objdump
查找libNNN.so中的段
使用pmap
或/proc/1234/maps
了解pid 1234过程的内存映射。(从应用程序内部,按顺序读取/proc/self/maps
,如果需要,或/proc/self/statm
,如果要测量)
<注意>代码> const C中的东西经常进入<代码> .RODATAs/COD>,但用C++构造的数据这不是我的问题+ 1,也是一个重要的问题。你可以为非常数、读写数据添加一个问题B。DSO如何彻底处理“<代码> const <代码> >数据并避免重新定位。