C++ 用尽可能多的 const 是好风格吗?

2023-09-18 18:14:30 +08:00
 iqoo

之前写 TypeScript 时,习惯给能加 const 的变量都加上 const 。

但 C++ 里加上 const 后代码累赘了不少。

const auto v = .....

const char* const buf = ....

而且 STL 容器使用 const 修饰后,容器本身也不能修改了,而非只是变量不能改。

所以 C++ 里加上尽可能多的 const 是不是一个好风格?

4292 次点击
所在节点    C++
42 条回复
leimao
2023-09-18 23:52:42 +08:00
leimao
2023-09-18 23:56:13 +08:00
const is also very useful in many different applications in practice, in addition to the optimizations from the compiler:
https://leimao.github.io/blog/CPP-Const-Overloading/
https://leimao.github.io/blog/CPP-Const-Iterator/
leimao
2023-09-19 00:00:09 +08:00
Also do not abuse define in C++.
shaoyie
2023-09-19 00:21:35 +08:00
你把写代码看作是写文章,主要是你要表达的主义要丰富,合理,恰到好处
InvalidUsername
2023-09-19 00:32:00 +08:00
是的,「 Effective C++」中 条款 03 就是:尽可能使用 const
haohaolee
2023-09-19 01:18:01 +08:00
如果找不到理由不加 const ,那就加。搜索 const correctness
tyzandhr
2023-09-19 01:30:04 +08:00
谷歌风格指南里写,函数参数若不是传出值的指针,则必须写 const 。实际上我会尽可能用 constexpr 吧。
dangyuluo
2023-09-19 04:07:35 +08:00
@tool2d 相反,编译器又笨又保守(in a sense),没有你的指示,根本不敢做任何优化。所以正确地使用`const`才能让编译器变聪明
dangyuluo
2023-09-19 04:13:13 +08:00
比如在某个函数内,编译器无法保证其他进程不去改变`debug`这个 namespace scope 变量,就要傻傻地去生成 ASM 代码。加一条`bool debug_local = debug`就好了

```cpp
for (int i = 0; i < n; i++) {
...
if (debug) { // Global variable, can be possibly changed by printf
printf("The data is NaN\n");
}
}
```
nuk
2023-09-19 05:05:04 +08:00
不加,从来不加,C 本来就是需要修改各种变量的,除在形参以外的 const 毫无意义。
tool2d
2023-09-19 09:29:17 +08:00
@dangyuluo 这情况要加 volatile ,让编译器不优化这个局部变量。

以前 gcc 很笨拙,毕竟那么多年的屎山。clang 不知道帮 gcc 填了多少坑。
Evovil
2023-09-19 09:48:17 +08:00
就是因为经常有人讨论,加 const 是不是最佳实践
才会出现 rust 这种完全不信任程序员的语言。。。
araraloren
2023-09-19 09:52:35 +08:00
@nuk c is not c++
yolee599
2023-09-19 09:55:25 +08:00
一些常量一般我都加 const ,比如查表法算 CRC 的表,接收到的指令和回调的映射表,字符串。还有函数参数只输入的,加 const 后就可以同时接收 const 和非 const 的变量,通用型更强。
hazardous
2023-09-19 10:30:03 +08:00
不但变量加 const ,成员函数我现在都能加 const 都加 const 了
dangyuluo
2023-09-19 10:46:43 +08:00
@tool2d `clang`在处理这个问题上是一样的,也是不敢贸然优化。不是 GCC 的锅。

这里用 volatile 是错的思路。具体就不详细展开了,这有一篇很好的文章。
https://liam.page/2018/01/18/volatile-in-C-and-Cpp/
dangyuluo
2023-09-19 10:48:42 +08:00
不过可以理解,关于 volatile 有太多错误的“讲解”了,很多人理解都有问题
dangyuluo
2023-09-19 10:55:30 +08:00
我突然想通你为什么说用 volatile 了,因为我们讨论的问题不是同一个。我指的是如果编译器能确定 loop 里的函数没有 side effect 后,可以执行 Loop unswitching 优化。Local const 变量可以做到这点

https://en.wikipedia.org/wiki/Loop_unswitching

你指的是如何用 volatile “禁止”编译器优化掉`if(debug)`,从而每次循环都去内存位置检查`debug`的 most-up-to-date 值
lakehylia
2023-09-19 11:07:10 +08:00
实际上,ide 会提示你加 const 更好。。。
lotem
2023-09-19 18:03:27 +08:00
能加 const 就加,是好的編碼習慣。卻不是好的風格。
好的風格是,像某些其他語言那樣,變量綁定默認不可變。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/974941

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX