【发布时间】:2013-06-15 16:02:11
【问题描述】:
【问题讨论】:
标签: c++ g++ static-linking
【问题讨论】:
标签: c++ g++ static-linking
链接中的文章讨论了在操作系统内核中内联小函数的副作用。这确实对性能产生了明显的影响,因为在整个系统调用序列中,从许多不同的地方调用了相同的函数——例如,如果你调用open,然后调用read、seekwrite , open 将在内核的某处存储一个文件句柄,并且在对read、seek 和write 的调用中,必须“找到”该句柄。如果这是一个内联函数,我们现在在缓存中拥有该函数的三个副本,而 read 调用与 seek 和 write 相同的函数完全没有任何好处。如果是“非内联”函数,当seek 和write 调用该函数时,它确实会在缓存中准备好。
对于给定的进程,无论是静态链接还是动态链接,一旦应用程序完全加载,影响很小。如果应用程序有很多副本,那么其他进程可能会受益于为共享库重用相同的内存。但是该进程所需的大小保持不变,无论它与 0、1、3 还是 100 个其他进程共享。在许多可执行文件之间共享二进制文件的好处来自于系统中几乎每个可执行文件背后的 C 库之类的东西 - 因此,当您在系统中运行 1000 个进程时,所有进程都使用相同的基本运行时系统,有只有一份而不是 1000 份代码。但它不太可能对任何特定应用程序的缓存效率产生太大影响——也许像strcpy 之类的常用函数被使用得足够频繁,以至于当操作系统任务切换时,它仍然在缓存中的可能性很小下一个应用程序执行strcpy。
所以,总而言之:可能根本没有任何区别。
【讨论】:
静态版本的整体内存占用与动态版本相同;请记住,动态链接的对象仍然需要加载到内存中!
当然,人们也可以争辩说,如果有多个进程在运行,并且它们都动态链接到同一个对象,那么内存中只需要一个副本,因此总占用空间比它们都静态的要低链接。
[免责声明:以上所有内容都是有根据的猜测;我从未测量过链接对缓存行为的影响。]
【讨论】: