据我所知,引用是变量的另一个名称,而指针则是自己的变量。指针占用空间。人们经常说“使用引用或指针”,但他们并没有说明哪个更好。如果引用不占用自己的内存,则在这方面引用胜出。我不知道编译器是否区分引用和普通变量。如果您对引用进行操作,它是否会编译为与普通变量相同的代码?
据我所知,引用是变量的另一个名称,而指针则是自己的变量。指针占用空间。人们经常说“使用引用或指针”,但他们并没有说明哪个更好。如果引用不占用自己的内存,则在这方面引用胜出。我不知道编译器是否区分引用和普通变量。如果您对引用进行操作,它是否会编译为与普通变量相同的代码?
在内部,引用也是通过指针实现的。因此,很难说哪种更快,指针还是引用。
使用这两种方式的区别在于应用场景。
例如,您想将参数按引用传递给函数。
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
}
int*p = NULL;
int &a = *p;
NULL
的人,认为该参数是可选的。 - Matteo Italia以下是我的两个测试程序:
参考资料:
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
-O3
或 -O2
这样的优化标志转储汇编代码,然后再进行比较? - manav m-n-Os
,它产生最易读的汇编代码。 - cmaster - reinstate monica-c
进行编译(除了-S -O3
)。 - Matteo Italia