由于缓存未命中,我应该避免静态编译?

时间:2013-06-15 16:02:12

标签: c++ g++ static-linking

标题总结了整个故事,我是reading this,关键是

  

更大的可执行文件意味着更多缓存未命中

并且由于静态可执行文件的定义大于动态链接的静态可执行文件,我很好奇这个案例中的实际考虑因素。

2 个答案:

答案 0 :(得分:3)

静态版本的总内存占用量与动态版本相同;请记住,动态链接的对象仍然需要加载到内存中!

当然,人们还可以争辩说,如果有多个进程在运行,并且它们都是动态地链接到同一个对象,那么内存中只需要一个副本,因此聚合占用空间低于它们全部静态的联的。

[免责声明:以上所有内容都是受过教育的猜测;我从未测量过链接对缓存行为的影响。]

答案 1 :(得分:3)

该链接中的文章讨论了在内核操作系统中内联小函数的副作用。这确实对性能有显着影响,因为在整个系统调用序列中从许多不同的地方调用相同的函数 - 例如,如果您调用open,然后调用read,{{ 1}} seekwrite会在内核中的某个位置存储文件句柄,并且在调用openreadseek时会处理必须被“发现”。如果这是一个内联函数,我们现在在缓存中有三个该函数的副本,write调用与readseek相同的函数没有任何好处。如果它是一个“非内联”函数,当writeseek调用该函数时,它确实会在缓存中准备就绪。

对于给定的进程,代码是静态链接还是动态链接,一旦应用程序完全加载,将产生非常小的影响。如果有多个应用程序副本,则其他进程可能会从共享库重用相同内存中受益。但是,无论是与0,1,3或100个其他进程共享,该进程所需的大小都保持不变。在许多可执行文件中共享二进制文件的好处来自于C库,它几乎是系统中每个可执行文件的后面 - 所以当你在系统中运行1000个进程时,所有使用相同的基本运行时系统,只有一个副本而不是1000个代码副本。但它不太可能对任何特定应用程序的缓存效率产生太大影响 - 可能常见的函数如write等等经常使用,以至于当OS任务切换时,它仍然在当下一个应用程序执行strcpy时缓存。

所以,总结一下:可能根本没有任何区别。