下面的控制流程图来自记事本中的单个功能(Win7 64位)。为什么链接程序(或编译器)将单个函数的基本块分成多个不连续(不连续)的块?



评论

查看“工作集调整”以及我的这个半相关答案。

@ CarstenC4:为什么要考虑这些单独的地址范围?你能详细说明吗?从您的问题来看,他们似乎都使用完全相同的地址范围,这使您的问题有点不清楚。

@ CarstenC4:您的意思是为什么函数在内存中不连续?即为什么要分块?

@ 0xC..22L:“不连续”是更好的措辞,谢谢

这样做是为了缓存局部性。他们试图将功能的“热路径”保留在一个高速缓存行中,而“冷路径”则保留在另一高速缓存行中。

#1 楼

DCoder已经在注释中引用了他自己的答案。

控制流程图中的块通常称为基本块或扩展的基本块。对它们进行重新排序的原因必须是由编译器执行的优化。基本块重新排序
分区交错

我强烈建议,如果您对此主题感兴趣,请阅读编译器设计。特别是,我建议您阅读“巨龙书”(Aho,Lam,Sethi和Ullman撰写的“编译器-原理,技术和工具”),其中包括有关优化的部分。在这里,我指的是2007年的第二版(ISBN:0-321-48681-1)。块”)和后者的8.5.7(“从DAG组装基本块”)中。但这仅仅是开始。第9章从整体上看同样重要,第11.10节(“位置优化”)也是如此。从分区交织小节的介绍性段落中提出您要进行这种优化的原因之一:


11.10.3分区交织

>循环中的不同分区通常会读取相同的数据,或读取和写入相同的缓存行。 [...]


引用了Aho,Lam,Sethi和Ullman的“编译器-原理,技术和工具”。 DCoder在他/她对您的问题的评论中已经提到的内容。但是,它比“为什么做”更关注“它的外观”。