C++默认参数值

9

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

谢谢 杰克

1个回答

31

它们不一定会被存储在任何地方。在最简单的情况下,编译器将会如同缺失的参数存在一样,编译函数调用。

例如:

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

f(1);
f(1, 5);

调用 f() 的这两个函数很可能编译成完全相同的汇编代码。您可以通过要求编译器为目标代码生成汇编清单来检查此内容。

我的编译器生成:

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

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

如您所见,生成的代码完全一致。


9
为了这个原因,缺省参数是在头文件中指定而不是在实现文件中指定。 - Billy ONeal
+1 我以前从来没有深入思考过这个问题,但你的回答非常有道理!这也大大简化了事情;当我开始使用C++时,我想知道虚函数如何在具有默认参数值时被覆盖。我曾经想过默认值会以某种方式修改签名或生成更多函数,但只在调用站点处理它(而不对函数本身进行任何操作)是最有意义的。 - stinky472

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接