什么时候使用 `const` 作为函数参数会效率低下?

When could it be inefficient to use `const` for function arguments?

[我编辑了我的问题以回答我收到的一些第一批评论。]

众所周知据说当我们不打算修改函数内的输入值时,将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/:

Therefore, const references provide functionality similar to passing arguments by value, but with an increased efficiency for parameters of large types. That is why they are extremely popular in C++ for arguments of compound types. Note though, that for most fundamental types, there is no noticeable difference in efficiency, and in some cases, const references may even be less efficient!

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

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

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


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

正如一些人在下面的评论中所说,我可能误解了我上面引用的文字,因为它似乎指的是 C++ 的情况,其中 variables/arguments/parameters 可以通过引用传递给函数, C 中不是这种情况。

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

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

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

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

what are those cases in which adding const to some of the arguments or parameters of a function may result in a less efficient code??

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

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

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

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

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

My question is about when using const could be not advisable.

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

有问题的句子是:

Note though, that for most fundamental types, there is no noticeable difference in efficiency, and in some cases, const references may even be less efficient!

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