C++ 提示编译器帮助它完成优化任务
“发行版幸存”一章让我想到,编译器可以使用const关键字作为优化工作的提示 您是否知道编译器的其他优化提示或函数的设计原则,以便编译器可以将它们内联 顺便问一下,您是否将基元类型函数参数声明为常量或常量引用(如C++ 提示编译器帮助它完成优化任务,c++,optimization,compiler-construction,compiler-optimization,C++,Optimization,Compiler Construction,Compiler Optimization,“发行版幸存”一章让我想到,编译器可以使用const关键字作为优化工作的提示 您是否知道编译器的其他优化提示或函数的设计原则,以便编译器可以将它们内联 顺便问一下,您是否将基元类型函数参数声明为常量或常量引用(如void foo(const int i)或void foo(const int&i)) 谢谢 我不认为编译器可以使用const关键字进行优化,因为在任何时候,constness都可以被丢弃 与其说是优化,不如说是正确性。很少有const限定可以帮助编译器优化代码。你可以在Herb Su
void foo(const int i)
或void foo(const int&i)
)
谢谢 我不认为编译器可以使用const关键字进行优化,因为在任何时候,constness都可以被丢弃
与其说是优化,不如说是正确性。很少有
const
限定可以帮助编译器优化代码。你可以在Herb Sutter的文章中读到更多关于为什么会出现这种情况的信息
关于您的最后一个问题:一般来说,您应该更喜欢按值传递易于复制的对象(如基本类型对象--int
s和float
s等等--以及小型类类型对象),并按常量引用传递其他类型。这是一条非常普遍的规则,有很多警告和例外情况。一些“通用编译器”的事情我不知道
- 常量作为变量永远不会改变的提示
- volatile作为变量可以在任意点更改的提示
- 限制关键字
- 内存障碍(向编译器提示一个特定的顺序)-在你看来,可能不是一个“优化”
- 内联关键字(非常小心地使用)
然而,所有这些都应该来自一个广泛的分析例程,这样您就知道实际需要优化什么。编译器通常非常擅长优化,而不需要程序员提供太多提示。一旦启用一些优化,编译器就会注意到参数
i
从未被修改过,因此您是否将其声明为int
或const int
对于生成的代码并不重要
通过
const&
传递参数的目的是避免不必要的复制。在小参数的情况下(一个机器字或更少),这不会导致更好的性能,所以您不应该这样做foo(int)
比foo(const int&)
更有效这两种形式都没有实际的好处。如果类型少于一个机器字,则按值获取。另一件事是,现代编译器的语义分析远远超出了const所能做和不能做的,只有当它是预编译的或者代码非常复杂时,才能应用优化。您链接到的文章已经有几年历史了,从那以后,编译器只做了大量改进。如果您查看Linux内核或类似项目的源代码,您将发现传递给gcc(或使用的任何编译器)的所有优化线索。Linux内核使用gcc提供的所有功能,即使它不在标准中
总结了gcc对C语言的扩展。我在这里引用C是因为C中也使用const和volatile。在C或C++中,编译器优化成为这里的焦点问题。 < P>我不认为代码> const <代码>的真正目的与优化有很大关系,尽管它有帮助。 编译时检查的真正价值不在于防止您修改不应该修改的内容,即防止bug吗 对于不打算修改的小参数,请使用“按值调用” 对于不打算修改的大型参数,请使用“按引用调用”或“传递地址”(基本上是相同的),以及
const
对于要修改的大参数或小参数,请删除常量
顺便说一句:如果这是新闻,为了获得真正的性能,你需要知道如何通过分析发现你实际遇到的问题。没有编译器能为您做到这一点。在这些编译器中,现代编译器上唯一能为优化做任何事情的就是restrict关键字。。。这不是标准的C++,错误的假设。不允许总是将
常数
丢弃,即在常数int i=5
中,不能丢弃i
的常数。优化器可能(也将!)依赖于此,用5
替换变量访问。当您试图丢弃常量对象的常量时,您会得到未定义的行为,因此优化器可能会发出不适合这些情况的代码。我明白了。然而,在这种情况下,const有什么区别吗?编译器难道不知道“i”是不变的,并将其内联吗?