C++默认参数值

use*_*499 8 c++

编译器在哪里存储C++中的默认参数值?全局堆,堆栈还是数据段?

谢谢杰克

Gre*_*ill 31

它们不一定存储在任何地方.在最简单的情况下,编译器将编译一个函数调用,就像存在缺少的参数一样.

例如,

void f(int a, int b = 5) {
    cout << a << b << endl;
}

f(1);
f(1, 5);
Run Code Online (Sandbox Code Playgroud)

这两个调用f()可能编译为完全相同的汇编代码.您可以通过要求编译器生成目标代码的程序集列表来检查这一点.

我的编译生成:

    movl    $5, 4(%esp)    ; f(1)
    movl    $1, (%esp)
    call    __Z1fii

    movl    $5, 4(%esp)    ; f(1, 5)
    movl    $1, (%esp)
    call    __Z1fii
Run Code Online (Sandbox Code Playgroud)

如您所见,生成的代码是相同的.

  • +1 - 这就是在头文件中而不是在实现文件中指定默认参数的原因. (9认同)
  • @stinky:这也意味着如果默认值发生变化,客户端必须重新编译... (2认同)