const在C/C++中提供了哪些优化?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了const在C/C++中提供了哪些优化?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2052字,纯文字阅读大概需要3分钟。
内容图文
我知道在可能的情况下,在通过引用或指针传递参数时,应尽可能使用const关键字.如果我指定参数是常量,编译器可以做的任何优化吗?
可能有几种情况:
功能参数:
常量参考:
void foo(const SomeClass& obj)
Constant SomeClass对象:
void foo(const SomeClass* pObj)
并且指向SomeClass的常量指针:
void foo(SomeClass* const pObj)
变量声明:
const int i = 1234
函数声明:
const char* foo()
每个提供什么样的编译器优化(如果有的话)?
解决方法:
[读者请注意,这篇文章的大部分内容都来自Herb Sutter的一篇文章 – http://www.gotw.ca/gotw/081.htm – 没有OP的归属.]
情况1:-
在程序中声明const时
int const x = 2;
编译器可以通过不为此变量提供存储来优化远离此const,而是将其添加到符号表中.因此,后续读取只需要间接到符号表而不是从内存中获取值的指令.
注意: – 如果您执行以下操作: –
const int x = 1;
const int* y = &x;
然后这会迫使编译器为’x’分配空间.因此,对于这种情况,这种优化程度是不可能的.
在函数参数方面,const表示该函数中未修改参数.据我所知,使用const并没有显着的性能提升,而是确保正确性的手段.
CASE_2: –
“将参数和/或返回值声明为const是否有助于编译器生成更优的代码?”
const Y& f( const X& x )
{
// ... do something with x and find a Y object ...
return someY;
}
QUES =>编译器能做得更好吗?
=>它可以避免参数或返回值的副本吗?
不,因为参数已经通过引用传递.
=>它可以将x或someY的副本放入只读内存吗?
不,因为x和y都生活在其范围之外,来自和/或被赋予外部世界.即使someY在f()本身内动态分配,它和它的所有权也会被放弃给调用者.
QUES =>那些出现在f()体内的代码的可能优化呢?由于const,编译器能否以某种方式改进它为f()体生成的代码?
即使调用const成员函数,编译器也不能假设对象x或对象someY的位不会被更改.此外,还有其他问题(除非编译器执行全局优化):编译器也可能不确定没有其他代码可能有非const引用,该引用将同一对象别名为x和/或someY,以及是否有任何此类在执行f()期间,可能会偶然使用对同一对象的非const引用;并且编译器甚至可能不知道x和someY仅仅是引用的真实对象实际上是否首先被声明为const.
CASE_3: –
void f( const Z z )
{
// ...
}
QUES =>这会有优化吗?
是的,因为编译器知道z确实是一个const对象,即使没有全局分析,它也可以执行一些有用的优化.例如,如果f()的主体包含像g(& z)这样的调用,编译器可以确保z的非可变部分在调用g()期间不会改变
内容总结
以上是互联网集市为您收集整理的const在C/C++中提供了哪些优化?全部内容,希望文章能够帮你解决const在C/C++中提供了哪些优化?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。