【问题标题】:When could it be inefficient to use `const` for function arguments?什么时候对函数参数使用 `const` 会效率低下?
【发布时间】:2022-01-21 05:47:15
【问题描述】:

[我编辑了我的问题以回答我得到的第一个 cmets。]

众所周知 据说当我们不打算修改函数内的输入值时,将const添加到函数参数中被认为是一种良好的编程习惯和一种优化编译的方法;例如,请参阅以下线程:

为了更清楚,我的意思是:

int my_function(const int i, const my_struct *p) {

/* where `my_struct` is a large struct previously defined by me */

/* Both `i` (passed by value) and `p` (and/or `*p`?) are meant to remain unchanged during all this function */

[...]

}

但是,我在这个 C++ 教程中读到了以下句子:https://www.cplusplus.com/doc/tutorial/functions/:

因此,const 引用提供了类似于按值传递参数的功能,但提高了大类型参数的效率。这就是为什么它们在 C++ 中对于复合类型的参数非常流行。但请注意,对于大多数基本类型,效率没有明显差异,在某些情况下,const 引用甚至可能效率更低!

那么,在哪些情况下将const 添加到函数的某些参数或参数可能会导致代码效率降低?任何提示或任何一般经验法则? p>

注意:我使用 C 编程,而不是 C++。我知道您只能在 C 中按值传递变量。但是,我知道在函数期间指定参数何时保持不变仍然很有用。

我坚持:我的问题不是关于按引用传递还是按值传递。我正在用 C 编程,所以我假设参数是按值传递的。 我的问题是不建议使用 const


编辑(重新打开我的问题后):

正如一些人在下面的 cmets 中所说,我可能误解了我上面引用的文本,因为它似乎指的是 C++ 案例,其中变量/参数/参数可以通过引用函数来传递,即C 中的情况并非如此。

无论如何,最后,我怀疑在某些情况下使用const 是否效率低下,我认为这已经在接受的答案中得到了回答。

【问题讨论】:

  • "众所周知" --> "有人断言"。
  • n some cases, const ***references*** 在 C 中没有引用。你问的是 C 还是 C++?
  • 放大:您关注的评论主要是关于传递值vs。通过引用传递(这在 C 中甚至不相关)。 constness 与该点没有直接关系。
  • 另外,虽然有些人确实推荐const函数参数作为风格和意图信号的问题,但它与现代编译器的优化无关。编译器不需要你告诉它你是否修改了函数体中变量的任何特定参数。
  • 这个问题不应该被关闭,至少不是因为不够清晰。它基于一个错误的前提,但提出的问题似乎很清楚。

标签: c function compilation arguments constants


【解决方案1】:

C++ 中的句子是关于通过引用传递(特殊的 C++ 语法void foo(int &x); - 注意&)。在 C 语言中,没有什么比通过引用(在 C++ 意义上)传递更好的了。

它与 C 中的引用传递没有任何共同之处。

在 C 中const 参数通常允许编译器使用更积极的优化方法。

在哪些情况下将 const 添加到某些参数或 函数的参数可能会导致代码效率降低??

*这些情况仅与 C++ 相关,编译器可能会在调用函数时必须创建容器的单独副本。

正如我在评论中所写,在学习 C 时不要阅读 C++ 教程。这些语言具有相似的语法(可能会欺骗您)但非常不同。

在您学习语言时,我建议您不要过多考虑微优化。初学者经常关注它们,当他们的主要算法很糟糕时试图节省纳秒。

【讨论】:

  • 我认为这是不正确的:“在 C 中,const 参数通常允许编译器使用更激进的优化方法。” — 事实上,const parameters in C don’t allow any optimisations,因为程序丢弃const 限定符并修改参数是合法的。只有变量定义中的const允许优化。
【解决方案2】:

在我看来,const 关键字最重要的用途是为了代码清晰。它告诉源代码的读者该变量旨在保持不变。我强烈建议尽可能多地使用const

我不会担心将const 关键字用于优化轻推目的。编译器在优化代码方面越来越好,我认为使用 const 不会在实践中产生显着差异。

【讨论】:

    【解决方案3】:

    我的问题是关于何时使用 const 是不可取的。

    在函数定义中不使用const,以提高效率,这在 C 语言中不是一个真正的问题。

    【讨论】:

      【解决方案4】:

      有问题的句子是:

      但请注意,对于大多数基本类型,效率没有明显差异,在某些情况下,const 引用甚至可能效率更低!

      注意这句话是在谈论基本类型,例如intchar。如果我们传递一个基本类型,它通常被简单地放入一个寄存器中以供被调用的例程使用。如果我们改为通过引用传递它(在 C 中通过指针包含),那么它的地址将被放入寄存器中。然后被调用的例程必须通过从内存中加载它来获取值。因此,在这种情况下,通过引用传递会增加开销。如果多次使用该值,甚至可能需要多次加载该值,因为可能会修改它。 (对于被调用例程它是const 的事实并不意味着对于调用者它是const。该对象可以由不包括const 的其他指针指向和/或由被调用的其他例程更改例行调用。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-12
        相关资源
        最近更新 更多