const在C / C中提供什么样的优化? (如有)

我知道在可能的情况下,应该使用const关键字通过引用传递参数或通过指针可读性的原因。有没有任何优化,编译器可以做,如果我指定参数是常量?

可能有几种情况:

功能参数:

常数参考:

void foo(const SomeClass& obj)

常量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 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和一些人居住在其范围之外,来自和/或被给予外部世界。即使有些是在f()本身内动态分配的,它和它的所有权也会被分配给调用者。

Ques => f()体内出现的代码的可能优化如何?因为const,可以编译器不知何故改进它为f()的主体生成的代码?

即使当你调用一个const成员函数,编译器不能假设对象x或对象someY的位不会被改变。此外,还有其他问题(除非编译器执行全局优化):编译器也可能不知道没有其他代码可能有一个非const引用将相同的对象与x和/或someY进行别名,以及是否有任何这样的对同一对象的非const引用可能在f()的执行期间偶然使用;并且编译器甚至可能不知道实际对象,x和someY仅仅是引用,实际上首先被声明为const。

CASE_3: –

  void f( const Z z )
  {
    // ...
  }

Ques =>这里有什么优化吗?

是的,因为编译器知道z真正是一个const对象,它可以执行一些有用的优化,即使没有全局分析。例如,如果f()的主体包含类似g(& z)的调用,编译器可以确保z的不可变部分在调用g()期间不改变,

http://stackoverflow.com/questions/27466642/what-kind-of-optimization-does-const-offer-in-c-c-if-any

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:const在C / C中提供什么样的优化? (如有)