参考或指针更快吗?

时间:2014-11-27 06:23:29

标签: c++ performance pointers reference

据我所知,引用只是变量的另一个名称,而指针是它们自己的变量。指针占用空间。人们经常说“使用引用或指针”,但他们并没有说哪个更好。如果引用不占用自己的记忆,则引用在该部门中获胜。我不知道的是编译器是否区分了引用和普通变量。如果对引用执行操作,它是否编译为与普通变量相同的代码?

3 个答案:

答案 0 :(得分:3)

内部引用也是根据指针实现的。因此,很难说哪个是更快的指针/参考。

这两种用法有所不同。

例如,您希望通过引用将参数传递给函数。

void func(int& a)    case_1
{
  //No need to check for NULL reference...
}
void func(int* a)    case_2
{
  //Need o check if pointer is not NULL
}

在case_2中,你必须在取消它之前显式检查指针是否为NULL,而不是引用的情况,因为引用被初始化为某种东西。

假设您正在以文明的方式玩游戏,即

你没有做类似的事情: -

int*p = NULL;
int &a = *p;

答案 1 :(得分:1)

它们是相同的,引用只是一个语法机制,它是一个不能为null的指针。差异仅存在于编译阶段,如果您尝试做非法的事情,您将收到投诉。

答案 2 :(得分:1)

以下是我的两个测试程序:

参考:

int i = 0;
int& r = i;
++r;
int j = 0;
++j;

指针:

int i = 0;
int* r = &i;
++(*r);
int j = 0;
++j;

我的编译器为两者编写了完全相同的汇编代码。

movl    $0, -16(%rbp)   #, i
leaq    -16(%rbp), %rax #, tmp87
movq    %rax, -8(%rbp)  # tmp87, r
movq    -8(%rbp), %rax  # r, tmp88
movl    (%rax), %eax    # *r_1, D.31036
leal    1(%rax), %edx   #, D.31036
movq    -8(%rbp), %rax  # r, tmp89
movl    %edx, (%rax)    # D.31036, *r_1
movl    $0, -12(%rbp)   #, j
addl    $1, -12(%rbp)   #, j
movl    $0, %eax    #, D.31036