Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共享库(libNNN.so)是否应该共享常量数据?_C++_Linux - Fatal编程技术网

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

C++ 共享库(libNNN.so)是否应该共享常量数据?,c++,linux,C++,Linux,有一个问题与此类似,但答案并不针对linux系统中的静态常量数据(只读数据)。 情况就是这样: 系统上的许多程序都在使用共享库。那个共享库有大量常量数据。对于链接到(并使用)共享库的每个进程,const数据是否会复制到系统内存中? 我理解(或者我认为我理解)共享库的大小在一个“高”的级别上被计算在内,但是在幕后Linux不会交换可执行部分的副本。静态(命名空间级别)常量数据也是如此吗?如果共享对象libNNN.so在只读段中包含数据(例如,来自.rodata或.text段),则该段由dlopen

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

如果共享对象
libNNN.so
在只读段中包含数据(例如,来自
.rodata
.text
段),则该段由
dlopen
ld.so
使用
MAP\u共享的
so不同的过程进行加密(加载
libNNN.so
)使用该只读数据确实共享了包含它的物理RAM

静态或全局读写数据将进入一个
MAP\u PRIVATE
read-write
mmap
-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 <代码> >数据并避免重新定位。