通过引用传递对象是向其传递地址的更简单、更快且更安全的方法。
但对于大多数编译器来说,都是一样的:引用实际上是指针。
现在基本类型怎么样int
?将地址传递给int
在函数内部使用它会比通过复制传递它慢,因为在使用之前需要取消引用指针。
现代编译器如何处理这个?
int foo(const int & i)
{
cout << i; // Do whatever read-only with i.
}
我可以相信他们会把这个编译成这个吗?
int foo(const int i)
{
cout << i;
}
顺便说一句,在某些情况下,通过这两个选项甚至可能更快i
and &i
,然后使用i
用于阅读,以及*i
用于写作。
int foo(const int i, int * ptr_i)
{
cout << i; // no dereferencement, therefore faster (?)
// many more read-only operations with i.
*ptr_i = 123;
}
我可以相信他们会把这个编译成这个吗?
是的,你可以。[这里的“是”意味着不同,请阅读编辑部分,其中澄清了]
int foo(const int & i)
告诉编译器i
是对常量整数类型的引用。
编译器可以执行优化,但只允许执行以下优化:假设规则。因此,您可以放心,对于您的程序,上述行为将与(const
预选赛将受到尊重):
int foo(const int i)
假设规则:
C++ 标准允许编译器执行任何优化,只要生成的可执行文件表现出相同的可观察行为,就像已满足标准的所有要求一样。
对于斯坦德德斯球迷:
C++03 1.9《程序执行:
需要一致的实现来模拟(仅)抽象机的可观察行为。
脚注说:
该规定有时被称为“假设”规则,因为只要结果就像遵守了要求一样,只要可以从可观察的行为中确定,实施就可以自由地忽略本国际标准的任何要求的程序。例如,如果实际实现可以推断出其值未被使用并且不会产生影响程序可观察行为的副作用,则实际实现不需要评估表达式的一部分。
EDIT:
由于答案有些混乱,让我澄清一下:
优化不能在编译器上强制执行。因此编译器如何解释它取决于编译器。重要的是程序的可观察行为不会改变。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)