4

假设我有一个 C++ 类,其实现如下所示:

// ...

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

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

// ...

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

4

4 回答 4

5

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

所以没有理由关心这个。它不会有任何区别。

于 2012-11-01T04:03:41.283 回答
2

从技术上讲,没有。但是,在现代处理器上,您通常不需要像对数据缓存一样担心指令缓存,除非您有一个非常大的可执行文件或到处都有非常可怕的分支。

原因是缓存行只有大约 64 字节长,这意味着如果您的方法大于 64 字节(并且确实如此),即使它们直接相邻,也需要将它们加载到多个缓存条目中在物理内存中。

于 2012-11-01T03:56:16.703 回答
1

如果您需要那种级别的控制和优化,那么 C++ 不适合您。

但您问题的实际答案是“否”。

于 2012-11-01T03:54:04.707 回答
0

不,据我所知,您无法指定方法的位置。如果 C++ 允许嵌套过程,那将是确保被调用过程是本地的一种方法。

于 2012-11-01T03:53:59.947 回答