编译器的提示,以帮助它完成优化任务

时间:2010-11-14 22:14:50

标签: c++ optimization compiler-construction compiler-optimization

关于'存在发布版本'文章的const and volatile章节让我想到编译器可以使用 const 关键字作为其优化工作的提示。

您是否了解编译器的其他优化提示或函数的设计原则,以便编译器可以使它们内联?

顺便说一句,你是否将基本类型的函数参数声明为const或const引用(如void foo(const int i)void foo(const int& i))?

谢谢!

7 个答案:

答案 0 :(得分:3)

const资格认证很少能帮助编译器优化代码。您可以在Herb Sutter的"Constant Optimization?"

中详细了解为何会出现这种情况

关于你的上一个问题:一般来说,你应该更喜欢传递价值便宜的东西(比如基本类型的对象 - intfloat等等 - 而且很小类类型对象)并通过const引用传递其他类型。这是一个非常一般的规则,有很多警告和例外。

答案 1 :(得分:1)

我不认为编译器可以使用const关键字进行优化,因为在任何时候都可以将constness转换出来。

正确性优于优化。

答案 2 :(得分:1)

一旦启用某些优化,编译器就会注意到参数i永远不会被修改,因此无论您将其声明为int还是const int都无关紧要生成的代码。

const &传递参数的目的是避免不必要的复制。如果参数较小(一个机器字或更少),这不会带来更好的性能,所以你不应该这样做。 foo(int)foo(const int&)效率更高。

答案 3 :(得分:1)

任何一种形式都没有实际好处。如果类型少于一个机器字,请按值取值。另一件事是现代编译器的语义分析高于const可以做和不能做的事情,如果它是预编译的,或者你的代码非常复杂,你只能应用优化。您链接到的文章已有几年的历史了,编译器除此之外什么都没做,只是大量改进。

答案 4 :(得分:0)

一些“一般编译器”的东西是我的头脑。

  • const表示变量永远不会改变
  • volatile表示变量可以随时改变
  • 限制关键字
  • 内存障碍(向编译器提示特定的顺序) - 可能不是一个“优化”的想法。
  • 内联关键字(非常谨慎使用)

然而,所有这些只应来自广泛的分析例程,以便您了解实际需要优化的内容。一般来说,编译器非常擅长优化而没有太多来自程序员的提示。

答案 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

顺便说一句:如果是新闻,要获得真实的表现,你需要知道如何通过分析来找到你实际遇到的问题。没有编译器可以为你做到这一点。