取消引用指针会复制它吗?

wro*_*ame 35 c++ pointers dereference

是否取消引用指针并将其传递给通过引用获取其参数的函数会创建该对象的副本?

Goz*_*Goz 32

在这种情况下,指针的值被复制(尽管不一定是这种情况,因为优化器可能会优化它).

int val = *pPtr;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,不会发生任何副本:

int& rVal = *pPtr;
Run Code Online (Sandbox Code Playgroud)

没有复制的原因是因为引用不是机器代码级构造.它是一个更高级别的构造,因此是编译器在内部使用而不是为其生成特定代码的东西.

显然,同样适用于功能参数.

  • 它不是在第一种情况下复制的指针.这是它所指向的复制价值.在第二种情况下,指针被复制(逻辑上)而值不是. (6认同)
  • 我写了一个简单的测试程序来验证自己的答案,希望这有助于一些http://codepad.org/XDqahndf (2认同)

MSa*_*ers 7

在简单的情况下,没有.但是有更复杂的情况:

void foo(float const& arg);
int * p = new int(7);
foo(*p);
Run Code Online (Sandbox Code Playgroud)

这里,创建了一个临时对象,因为解除引用的指针(int)的类型与函数参数(float)的基本类型不匹配.存在转换序列,并且可以绑定转换后的临时序列,arg因为它是const引用.


ice*_*ime 5

希望它不会:如果被调用的函数按值获取其参数,则会发生这种情况。

此外,这是引用的预期行为:

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