关于'存在发布版本'文章的const and volatile章节让我想到编译器可以使用 const 关键字作为其优化工作的提示。
您是否了解编译器的其他优化提示或函数的设计原则,以便编译器可以使它们内联?
顺便说一句,你是否将基本类型的函数参数声明为const或const引用(如void foo(const int i)
或void foo(const int& i)
)?
谢谢!
答案 0 :(得分:3)
const
资格认证很少能帮助编译器优化代码。您可以在Herb Sutter的"Constant Optimization?"
关于你的上一个问题:一般来说,你应该更喜欢传递价值便宜的东西(比如基本类型的对象 - int
和float
等等 - 而且很小类类型对象)并通过const引用传递其他类型。这是一个非常一般的规则,有很多警告和例外。
答案 1 :(得分:1)
我不认为编译器可以使用const关键字进行优化,因为在任何时候都可以将constness转换出来。
正确性优于优化。
答案 2 :(得分:1)
一旦启用某些优化,编译器就会注意到参数i
永远不会被修改,因此无论您将其声明为int
还是const int
都无关紧要生成的代码。
const &
传递参数的目的是避免不必要的复制。如果参数较小(一个机器字或更少),这不会带来更好的性能,所以你不应该这样做。 foo(int)
比foo(const int&)
效率更高。
答案 3 :(得分:1)
任何一种形式都没有实际好处。如果类型少于一个机器字,请按值取值。另一件事是现代编译器的语义分析高于const可以做和不能做的事情,如果它是预编译的,或者你的代码非常复杂,你只能应用优化。您链接到的文章已有几年的历史了,编译器除此之外什么都没做,只是大量改进。
答案 4 :(得分:0)
一些“一般编译器”的东西是我的头脑。
然而,所有这些只应来自广泛的分析例程,以便您了解实际需要优化的内容。一般来说,编译器非常擅长优化而没有太多来自程序员的提示。
答案 5 :(得分:0)
如果您查看Linux内核或某些类似项目的来源,您将找到传递给gcc(或使用的任何编译器)的所有优化线索。 Linux内核使用gcc提供的所有功能,即使它不在标准中。
This page总结了gcc对C语言的扩展。我在这里提到了C,因为const和volatile也在C中使用。除了C或C ++之外,编译器优化也是这里问题的焦点。
答案 6 :(得分:0)
我不认为const
的真正目的与优化有很大关系,尽管它有所帮助。
编译时检查不是真正的价值,以防止你修改你不应该修改的东西,即防止错误吗?
对于您不打算修改的小参数,请使用call-by-value。
对于你不打算修改的大型参数,使用call-by-reference或传递地址(基本上是相同的东西),以及const
。
对于 要修改的大型或小型参数,请删除const
。