传入变量作为指针,引用,常量引用,等等:硬件级别会发生什么?

时间:2014-04-30 17:17:27

标签: c++ pointers

我想了解使用不同的方法将变量传递给函数时实际发生了什么。请批评我的理解,并在必要时劝告我。

我理解的第一件事是&#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;
}

除了更低效,因为你必须取消引用。

我对这一切是对的????

2 个答案:

答案 0 :(得分:1)

硬件只知道地址。在virtual memoryaddress spaceprocessesmicroarchitectureinstruction set architectureaddressing modeRAMCPU上阅读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)

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

(我希望这很有帮助)