指针和引用
结论:
引用 | 指针 |
---|---|
必须初始化 | 可以不初始化 |
不能为空 | 可以为空 |
不能更换目标 | 可以更换目标 |
1、引用必须初始化,而指针可以不用初始化。
2、引用不能为空,而指针可以为空。
3、引用不能更换目标,而指针可以随便指向任何地方。
指针和引用的性能比较:
指针与引用之间有没有性能差距呢?这种问题就需要进入汇编层面去看一下。我们先写一个test函数,参数传递使用指针:
void test(int* p)
{
*p = 3;
return;
}
(gdb) disassemble
Dump of assembler code for function _Z5testPi:
0x00000000004006e6 <+0>: push %rbp
0x00000000004006e7 <+1>: mov %rsp,%rbp
=> 0x00000000004006ea <+4>: mov %rdi,-0x8(%rbp)
0x00000000004006ee <+8>: mov -0x8(%rbp),%rax
0x00000000004006f2 <+12>: movl $0x3,(%rax)
0x00000000004006f8 <+18>: nop
0x00000000004006f9 <+19>: pop %rbp
0x00000000004006fa <+20>: retq
End of assembler dump.
再测试下引用:
void test(int& p)
{
p= 3;
return;
}
(gdb) disassemble
Dump of assembler code for function _Z5testRi:
0x00000000004006e6 <+0>: push %rbp
0x00000000004006e7 <+1>: mov %rsp,%rbp
=> 0x00000000004006ea <+4>: mov %rdi,-0x8(%rbp)
0x00000000004006ee <+8>: mov -0x8(%rbp),%rax
0x00000000004006f2 <+12>: movl $0x3,(%rax)
0x00000000004006f8 <+18>: nop
0x00000000004006f9 <+19>: pop %rbp
0x00000000004006fa <+20>: retq
End of assembler dump.
对比指针和引用,他们的汇编代码完全相同,所以根本不用担心指针和引用的性能问题。C++引入引用特性保证使用的安全性和便捷性,避免了指针泛滥的现象。