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