Goz*_*Goz 32
在这种情况下,指针的值被复制(尽管不一定是这种情况,因为优化器可能会优化它).
int val = *pPtr;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,不会发生任何副本:
int& rVal = *pPtr;
Run Code Online (Sandbox Code Playgroud)
没有复制的原因是因为引用不是机器代码级构造.它是一个更高级别的构造,因此是编译器在内部使用而不是为其生成特定代码的东西.
显然,同样适用于功能参数.
在简单的情况下,没有.但是有更复杂的情况:
void foo(float const& arg);
int * p = new int(7);
foo(*p);
Run Code Online (Sandbox Code Playgroud)
这里,创建了一个临时对象,因为解除引用的指针(int)的类型与函数参数(float)的基本类型不匹配.存在转换序列,并且可以绑定转换后的临时序列,arg因为它是const引用.
希望它不会:如果被调用的函数按值获取其参数,则会发生这种情况。
此外,这是引用的预期行为:
void inc(int &i) { ++i; }
int main()
{
int i = 0;
int *j = &i;
inc(*j);
std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
该代码预计会打印,1 因为 inc通过引用获取其参数。如果在调用时制作了副本inc,则代码将打印出来0。