哪个更快,指针访问或参考访问?

Mic*_*lla 7 c++ performance pointers reference

在下面的示例代码中,我分配了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;
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 10

对于任何非白痴编译器,它们应该是相同的(不是大致相同,但完全相同).在引擎盖下,引用指针(在99%的编译器上).没有理由有任何区别.

迂腐:第二个循环可能更快(可能不是),因为数据已经在缓存中,但就是这样.:)

  • 我没有downvote,虽然我倾向于这样做:*引用**是**指针*是假的.引用**是**别名,可以是也可以不是指针.语义是不同的,标准对待它们的方式不同.特别是在上面的代码中,编译器很可能甚至不会在堆栈中为引用保留空间,只是用引用的对象替换引用.8.3.2/4*未指定引用是否需要存储(3.7).*这不是**指针的行为. (6认同)
  • @DavidRodríguez-dribeas是和否.as-if规则允许编译器使用指针和引用完成相同的操作,_provided_它可以证明它们满足相同的条件.不同之处在于,编译器在没有任何分析的情况下知道不会重新引用引用,不能使用其地址等.在上面的简单代码中,这可能没什么区别,但在更复杂的实例中,使用引用而不是指针可以帮助编译器. (3认同)
  • 不是100%正确.引用不是指针,它们根本不是对象.在几种情况下,它们可以通过指针实现,但不是100%.为指针和参考生成的代码可能不同. (2认同)
  • @LuchianGrigore编译器是否使用指针实现引用将取决于很多事情; 大多数编译器会在某些情况下使用指针,但在其他情况下则不会.当然,即使你使用指针也是如此; 编译器也可以很容易地抑制指针,_if_它可以证明指针从未被重新安置. (2认同)
  • @LuchianGrigore好点.任何体面的编译器都会完全抑制这两个循环,因为它们中的状态变化对程序输出没有影响.然而,关于你与David的讨论:标准说引用是_not_对象,这使它们与指针完全不同.理论上.在实践中,我认为你不能区分引用和指针之间的区别,它在任何地方都会自动解除引用但在初始化时:引用的行为就像是一个自动解引用的指针. (2认同)