减少指令高速缓存未命中(在C++中)

Eph*_*era 4 c++ localityofreference

假设我有一个C++类,其实现看起来像这样:

// ...

MyClass::iterativeFunction() {
     for (int i = 0; i < 1000000; i++) {
          performAction(i);
     }
}

MyClass::performAction(int index) {
     // Block of code (non-inline-able)
}

// ...
Run Code Online (Sandbox Code Playgroud)

在C++级别,我是否可以控制这些方法的空间局部性,或者我是否只是希望编译器会注意到相关方法并相应地优化其程序集?理想情况下,我希望它们彼此相邻,以便将它们一起加载到指令缓存中,但我不知道如何让编译器知道我真的希望这种情况发生.

Dav*_*rtz 5

在任何一种情况下,代码都无法运行,直到它进入缓存.在任何一种情况下,对于代码流所在的CPU来说同样明显,因为流是无条件的.所以它不会有任何区别.现代代码高速缓存不会在地址空间中提取,它会在指令流中提前,无条件分支并根据需要预测条件分支.

所以没有理由关心这个.它没有任何区别.