yas*_*ser 9 c++ pointers reference
当c ++编译器为引用和指针生成非常相似的汇编代码时,为什么使用引用优先(并且认为比指针更安全)?
我确实看到了
编辑-1:
我正在查看g ++为这个小程序生成的汇编程序代码:
int main(int argc, char* argv[])
{
int a;
int &ra = a;
int *pa = &a;
}
Run Code Online (Sandbox Code Playgroud)
Ben*_*igt 18
它被认为更安全,因为很多人"听到"它更安全,然后告诉别人,他们现在也"听到"它更安全.
没有一个人理解参考文献会告诉你他们比指针更安全,他们有相同的缺陷和潜在的无效.
例如
#include <vector>
int main(void)
{
std::vector<int> v;
v.resize(1);
int& r = v[0];
r = 5; // ok, reference is valid
v.resize(1000);
r = 6; // BOOM!;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:由于似乎有一些关于引用是对象的别名还是绑定到内存位置的混淆,这里是标准(草案3225,部分[basic.life])中的段落,其中明确指出引用绑定到存储并且可以寿命创建引用时存在的对象:
如果在对象的生命周期结束之后并且在重用或释放对象占用的存储之前,则在原始对象占用的存储位置创建新对象,指向原始对象的指针,引用引用原始对象,或者原始对象的名称将自动引用新对象,并且一旦新对象的生命周期开始,就可以用来操纵新对象,如果:
- 新对象的存储完全覆盖原始对象占用的存储位置,以及
- 新对象与原始对象的类型相同(忽略顶级cv-quali firs),以及
- 原始对象的类型不是const-quali fi ed,如果是类类型,则不包含任何类型为const-quali fi ed或引用类型的非静态数据成员,以及
- 原始对象是类型最派生的对象,
T新对象是类型最派生的对象T(也就是说,它们不是基类子对象).
这取决于你如何定义"更安全".
编译器不允许您创建未初始化的引用,或者指向NULL的引用,并且在您使用它时,它不会让您意外地将引用引用到其他地方.这些更严格的规则也意味着您的编译器可以为您提供有关常见错误的更多警告,而使用指针则无法确定您是否打算做您所做或不做的事情.
另一方面,语法的透明度 - 即亚历山大C.提到的在调用网站上传递参数作为参考的内容 - 使得很容易没有意识到你正在传递一个参考.因此,您可能没有意识到您应该维护参数的所有权和生命周期,或者您的参数可能会被永久修改.
因为引用(它只是其他变量的别名)不能按照NULL定义,提供固有的安全层.