答案 0 :(得分:3)
静态版本的总内存占用量与动态版本相同;请记住,动态链接的对象仍然需要加载到内存中!
当然,人们还可以争辩说,如果有多个进程在运行,并且它们都是动态地链接到同一个对象,那么内存中只需要一个副本,因此聚合占用空间低于它们全部静态的联的。
[免责声明:以上所有内容都是受过教育的猜测;我从未测量过链接对缓存行为的影响。]
答案 1 :(得分:3)
该链接中的文章讨论了在内核操作系统中内联小函数的副作用。这确实对性能有显着影响,因为在整个系统调用序列中从许多不同的地方调用相同的函数 - 例如,如果您调用open
,然后调用read
,{{ 1}} seek
,write
会在内核中的某个位置存储文件句柄,并且在调用open
,read
和seek
时会处理必须被“发现”。如果这是一个内联函数,我们现在在缓存中有三个该函数的副本,write
调用与read
和seek
相同的函数没有任何好处。如果它是一个“非内联”函数,当write
和seek
调用该函数时,它确实会在缓存中准备就绪。
对于给定的进程,代码是静态链接还是动态链接,一旦应用程序完全加载,将产生非常小的影响。如果有多个应用程序副本,则其他进程可能会从共享库重用相同内存中受益。但是,无论是与0,1,3或100个其他进程共享,该进程所需的大小都保持不变。在许多可执行文件中共享二进制文件的好处来自于C库,它几乎是系统中每个可执行文件的后面 - 所以当你在系统中运行1000个进程时,所有使用相同的基本运行时系统,只有一个副本而不是1000个代码副本。但它不太可能对任何特定应用程序的缓存效率产生太大影响 - 可能常见的函数如write
等等经常使用,以至于当OS任务切换时,它仍然在当下一个应用程序执行strcpy
时缓存。
所以,总结一下:可能根本没有任何区别。