我想了解使用不同的方法将变量传递给函数时实际发生了什么。请批评我的理解,并在必要时劝告我。
我理解的第一件事是&#34;传入一个变量&#34; 只是一个表达式。函数是存储在某个内存位置的代码块,调用函数调用该代码块的执行。所有关于&#34;传递变量&#34; 和&#34;返回变量&#34; 的东西只是初学者编程的抽象。< / p>
大多数高级语言只有函数的pass-by-value。 (但是,有一些黑客可以通过引用传递行为,并且无论如何编译器会做任何它想要的地狱,所以你不能假设你知道会发生什么。)
C ++是一种低级语言和高级语言的混合体。它就像一种高级语言,您可以随时覆盖高级行为。
这是按价值传递的方式:
void foo(int a)
{
std::cout << a;
}
int main()
{
int a = 3;
foo(a);
return 0;
}
与
相同int main()
{
int a = 3;
// ---- this is the function executing -----
int temp = a;
std::cout << temp;
// -----------------------------------------
return 0;
}
这是传递引用的方式:
void foo(int& a)
{
std::cout << a;
}
int main()
{
int a = 3;
foo(a);
return 0;
}
与
相同void foo(int& a)
{
std::cout << a;
}
int main()
{
int a = 3;
// ---- this is the function executing -----
std::cout << a;
// -----------------------------------------
return 0;
}
这是指针传递的工作原理:
void foo(int* a)
{
std::cout << a;
}
int main()
{
int a = 3;
foo(&a);
return 0;
}
与
相同void foo(int* a)
{
std::cout << *a;
}
int main()
{
int a = 3;
// ---- this is the function executing -----
int* temp = &a;
std::cout << *temp;
// -----------------------------------------
return 0;
}
换句话说,除了值是指针之外,它与传递值相同。
现在,在C ++中一直看到const &
参数怎么样?这到底是做什么的?嗯,没什么特别的。
void foo(const int& a)
{
std::cout << a;
}
与
完全相同void foo(int& a)
{
std::cout << a;
}
const
只是您和编译器之间的协议,您在执行函数时不会更改a
的值。
如果传递对指针的引用怎么办?
void foo(int*& a)
{
std::cout << *a;
}
与
相同void foo(int& a)
{
std::cout << a;
}
除了更低效,因为你必须取消引用。
我对这一切是对的????
答案 0 :(得分:1)
硬件只知道地址。在virtual memory,address space,processes,microarchitecture,instruction set architecture,addressing mode,RAM,CPU上阅读wikipages ,x86
在硬件级别,引用,指针,地址都是相同的。
当然,您需要一个optimizing compiler。详细了解application binary interface(请参阅x86-64 ABI规范)和calling conventions(特别是x86 calling conventions)。
如果使用GCC,我建议使用g++ -Wall -S -O2 -fverbose-asm
进行编译,然后查看生成的汇编代码。
阅读Drepper的论文:What Every Programmer Should Know About Memory。
答案 1 :(得分:1)
(我希望这很有帮助)