11

在下面的示例代码中,我分配了 struct Chunk 的一些实例。在 for 循环中,我然后遍历内存块并使用指针或引用访问不同的实例,并为它们分配一些随机数据。

但是哪个 for 循环会执行得最快呢?据我所知,引用循环将是最快的,因为它不需要取消引用并且可以直接访问内存中的实例。我有多错/对?

struct Chunk {
    unsigned int a;
    float b;
    const char* c;
};

int main() {
    Chunk* pData = new Chunk[8];

    for( unsigned int i = 0; i < 8; ++i ) {
        Chunk* p = &pData[i];
        p->a = 1;
        p->b = 1.0f;
        p->c = "POINTERS";
    }

    for( unsigned int i = 0; i < 8; ++i ) {
        Chunk& r = pData[i];
        r.a = 1;
        r.b = 1.0f;
        r.c = "REFERENCES";
    }

    delete [] pData;
    return 0;
}
4

5 回答 5

13

它们应该与任何非白痴编译器相同(不是大致相同,而是完全相同)。在底层,引用指针(在 99% 的编译器上)。没有任何区别的理由。

Pedantic:第二个循环可能会更快(可能不会),因为数据已经在缓存中,但仅此而已。:)

于 2012-09-13T14:11:32.917 回答
2

我很想说:谁在乎?速度上的任何差异都可以忽略不计,您应该选择最易读的。在这种特殊情况下,我希望看到在两种情况下都生成完全相同的代码。在更复杂的情况下,编译器可能无法在循环的后面确定指针没有被重新定位,并且可能必须重新读取它。但要做到这一点,您必须做足够多的其他事情,以使差异无法衡量。

于 2012-09-13T14:41:54.037 回答
1

任何体面的编译器生成的代码都应该没有区别。

于 2012-09-13T14:12:59.090 回答
1

当您在示例中的代码的两个版本之间犹豫不决时,您应该选择更易读的一个。您建议的那种可能的优化应该由编译器完成。

在您的情况下,更具可读性的是带有引用的版本(实际上,也许不是真的更具可读性,但共识是更喜欢使用引用,因为指针更“危险”)。

But back to the effeciency: (please if someone knows assembler, better stop reading or you risk a laugh attack...) In my opinion, as the pData is alocated on the heap, the compiler will have to compile it using pointers anyway. I think that your reasoning could be kind of correct if your structure was allocated on the stack just with "Chunk data[8];". But at latest when the compiler optimizations are on the difference should be deleted anyway.

于 2012-09-13T14:33:59.693 回答
1

执行时间几乎相同,但使用不那么忙碌的引用。

于 2020-05-24T05:31:22.530 回答