C++ 以指针、引用、常量引用等形式传入变量:在硬件级别会发生什么?

C++ 以指针、引用、常量引用等形式传入变量:在硬件级别会发生什么?,c++,pointers,C++,Pointers,我想了解当使用不同的方法将变量传递给函数时,实际会发生什么。请评论我的理解,并在必要时对我进行解释 我理解的第一件事是“传入变量”只是一个表达式。函数是存储在某个内存位置的代码块,调用函数就是调用该代码块的执行。所有关于“传入变量”和“返回变量”的东西对于编程初学者来说只是一个抽象概念 大多数高级语言只有函数的传递值。(然而,有黑客通过引用传递行为,而且在任何情况下,编译器都会做它想做的事情,所以你不能假设你知道会发生什么。) C++是一种低级语言和高级语言的混合体。它就像一种高级语言,您可以随

我想了解当使用不同的方法将变量传递给函数时,实际会发生什么。请评论我的理解,并在必要时对我进行解释

我理解的第一件事是“传入变量”只是一个表达式。函数是存储在某个内存位置的代码块,调用函数就是调用该代码块的执行。所有关于“传入变量”和“返回变量”的东西对于编程初学者来说只是一个抽象概念

大多数高级语言只有函数的传递值。(然而,有黑客通过引用传递行为,而且在任何情况下,编译器都会做它想做的事情,所以你不能假设你知道会发生什么。)

C++是一种低级语言和高级语言的混合体。它就像一种高级语言,您可以随时覆盖高级行为

这就是传递值的工作原理:

void foo(int a)
{
    std::cout << a;
}

int main()
{
    int a = 3;
    foo(a);
    return 0;
}
工作原理与

void foo(int& a)
{
    std::cout << a;
}

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;
}
void foo(int& a)
{
    std::cout << a;
}
void foo(int&a)
{

硬件只知道地址。请阅读、、、、上的维基页面

在硬件级别,引用、指针和地址都是相同的

当然,您需要一个。了解更多关于(阅读规范)和(特别是)

如果使用GCC,我建议使用
g++-Wall-S-O2-fverbose asm进行编译,然后查看生成的汇编代码

阅读德雷珀的论文:。

  • 所有函数参数/结果值都通过其表示形式(值(整数/浮点)、指针或引用(将转换放在一边))传递
  • 任何表示都可以直接传递到CPU寄存器
  • 一个指针和一个引用基本上是相同的,都反映了一个内存地址,其中指针可以被修改以指向一个不同的地址,并且可以修改引用(由于C++功能)在它指向的地址上保持一个不同的值(再次:将转换放在一边)。

(我希望这会有所帮助)

需要注意的是,硬件可能不会以相同的方式处理指针和引用。如果编译器认为可以,他们可以优化掉引用。尽管在向函数传递引用时,我相信在大多数情况下和实现中,传输的处理方式很像指针,但我不认为必须这样.
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;
}
void foo(const int& a)
{
    std::cout << a;
}
void foo(int& a)
{
    std::cout << a;
}
void foo(int*& a)
{
    std::cout << *a;
}
void foo(int& a)
{
    std::cout << a;
}