C++ 引用或指针是否更快?

C++ 引用或指针是否更快?,c++,performance,pointers,reference,C++,Performance,Pointers,Reference,据我所知,引用只是变量的另一个名称,而指针是它们自己的变量。指针占用空间。人们经常说“使用引用或指针”,但他们没有说哪个更好。如果引用人不占用自己的内存,那么引用人在该部门获胜。我不知道的是编译器是否区分了引用和普通变量。如果对引用执行操作,它是否编译为与普通变量相同的代码 内部引用也根据指针实现。因此,很难说哪个指针/引用更快 这两个词的用法不同 例如,您希望通过引用将参数传递给函数 void func(int& a) case_1 { //No need to check

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

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

这两个词的用法不同

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

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
}
在案例2中,您必须在取消锁定指针之前显式检查指针是否不为NULL,而引用则不是这种情况,因为引用被初始化为某个对象

假设你们是以文明的方式玩游戏,即

你不是在做这样的事情:-

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

它们是一样的,引用只是一种语言机制,是一个不能为null的指针。区别只存在于编译阶段,在编译阶段,如果您试图做非法的事情,您将收到投诉。

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

参考:

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

W.r.t.性能,可能不太高(在您的平台上运行一些测量以检查)。我认为更重要的是澄清您想要的语义-记住,指针可以为NULL,因此可以争论是可选的。引用是伪装的指针,唯一的性能优势可以来自编译器可以对其进行的一些附加假设(它们不能合法重置,也不能为NULL)。相反,即使指针参数被设计为可选的,用户也可能害怕传递空指针。第一部分是绝对正确的。但是,在实践中,不需要许多空检查。只需在函数注释中记录您期望的非空指针,并让空页在不满足该前提条件的情况下使程序崩溃。实际上,由于指针访问不正确,您会遇到许多分段错误。@cmaster:希望您避免那些显式传递
NULL
的人认为参数是空的可选。它们在实践中可以为NULL,即使语言标准在创建NULL引用时调用未定义的行为。其效果与使用空指针时相同。调试更难,因为许多人会在引用不能为NULL的错觉下工作,因此不理解代码中发生了什么。它们可以是,但代码可以总是假设它们不是。你可以对指针使用相同的假设,产生相同的后果。总有奇怪的错误,但是在一个工作的设计中,引用总是有效的,指针可能是空的。你能在
-O3
-O2
上转储带有优化标志的程序集,然后再进行比较吗,这是没有帮助的。从堆栈中来回的所有这些似乎都表明您在编译此文件时禁用了优化,因此它没有任何意义。。。如果要避免编译器删除整个内容,请在最后将结果分配给
volatile
变量。使用全局volatile变量作为结果,其他变量保持正常。另外,我通常做的是将每个案例放在一个函数中,该函数返回结果并使用
-c
进行编译(除了
-S-O3
)。