【发布时间】:2012-11-01 03:48:50
【问题描述】:
假设我有一个 C++ 类,其实现如下所示:
// ...
MyClass::iterativeFunction() {
for (int i = 0; i < 1000000; i++) {
performAction(i);
}
}
MyClass::performAction(int index) {
// Block of code (non-inline-able)
}
// ...
在 C++ 级别,我是否可以控制这些方法的空间局部性,还是只希望编译器会注意到相关方法并相应地优化其程序集?理想情况下,我希望它们彼此相邻,以便将它们一起加载到指令缓存中,但我不知道如何让编译器知道我真的希望发生这种情况。
【问题讨论】:
-
“我希望它们彼此相邻,以便它们一起加载到指令缓存中。”这不是任何现代 CPU 的指令缓存的工作方式。它不会仅仅因为它恰好靠近其他代码而获取代码。它获取代码是因为调用了该代码。
-
将“执行操作”标记为内联/_forceinline/__pleasepleaseinline?
-
通过全程序优化,编译器很可能会发现
MyClass::performAction的唯一调用者是iterativeFunction,并且仍然内联它。只有一个调用者的函数的内联阈值要低得多。 -
除非您有 >4kb 的可执行代码,在这种情况下,代码位置可能很重要,尽管处于完全不同的级别。