Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 提示编译器帮助它完成优化任务_C++_Optimization_Compiler Construction_Compiler Optimization - Fatal编程技术网

C++ 提示编译器帮助它完成优化任务

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

“发行版幸存”一章让我想到,编译器可以使用const关键字作为优化工作的提示

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

顺便问一下,您是否将基元类型函数参数声明为常量或常量引用(如
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”是不变的,并将其内联吗?