[使用const参数编译c递归函数时的gcc行为

问题描述 投票:0回答:2

提供以下功能:

void rec_func(int a, int b, const int c) {
    /*
        flow control and stuff here
    */
    rec_func(a - 1, b, c);
}

gcc是否会为所有递归调用理解c是相同的常量值,然后将对所有调用使用相同的变量,否则它将在每次调用中将c的值复制到新的c变量?

对于b的相同问题,即使未标记为const,gcc也会理解为隐式const吗?

c recursion gcc parameters const
2个回答
0
投票

我的[[猜测是您从优化的角度出发。

如果是这种情况:

    不用担心;编译器比您*智能得多,并且会做得很好。
  1. 递归很少是“最佳”性能。
  • 如果您不尝试在控制逻辑中更改bc,则编译器

    可能

  • 做一些聪明的事情,但是传递int不太可能是个大问题。如果要传递一个巨大的结构,则可以考虑使用指针或引用。 无论如何,您都可以看到GCC将使用出色的godbolt工具做什么。

    但是正如我在评论中说的那样,不清楚您提出这个问题的动机是什么,所以我的回答可能会很遥远。

    [*]不是


    0
    投票
    我没有理论答案,但是通过测试代码并打印abc的地址,似乎在每个子调用中为每个参数创建了一个新变量:

    https://www.onlinegdb.com/Sy2AzZzN8

    ------------ New CALL ------------ Address of a : 6 46a0eb8c Address of b : 8 46a0eb88 Address of c : 10 46a0eb84 ------------ New CALL ------------ Address of a : 5 46a0eb6c Address of b : 8 46a0eb68 Address of c : 10 46a0eb64 != 46a0eb84

    我认为这很正常,因为每个函数都将参数定义为局部变量(在调用结束时不再存在。)>
    © www.soinside.com 2019 - 2024. All rights reserved.