【发布时间】:2013-04-04 22:18:06
【问题描述】:
所以我们都听说过 don't-use-register 这一行,原因是试图优化编译器是徒劳的。
register,据我所知,实际上并没有说明任何关于 CPU 寄存器的内容,只是不能间接引用给定的变量。我会冒险猜测它通常被称为过时,因为编译器可以自动检测到缺少寻址,从而使此类优化变得透明。
但是,如果我们对这个论点持坚定态度,难道不能把它放在 C 中每个优化驱动的关键字上吗?比如我们为什么要用inline和C99的restrict?
我想像别名这样的东西使得推导出一些优化困难甚至不可能,那么在我们开始冒险进入Sufficiently Smart Compiler 领域之前划定的界限在哪里?
应该在 C 和 C++ 中在舀入编译器优化信息和假设它知道自己在做什么之间划清界限?
编辑:Jens Gustedt 指出我将 C 和 C++ 混为一谈是不对的,因为其中两个关键字具有语义差异,而标准 C++ 中不存在一个。我在 C++ 中有一个关于 register 的很好的链接,如果我找到它,我会添加它...
【问题讨论】:
-
我对 C 了解不多,但在 C++ 中,
inline被用来规避 ODR。 -
“应该在哪里画线” - 我认为它应该总是被
基准测试分解。选择产生更好结果的那个。 -
你真的应该区分C和C++,在这里,它们与你提到的所有三个关键字都不一样:
inline和register具有不同的语义,restrict甚至不存在在 C++ 中。 -
@JensGustedt 谢谢,我会将其添加为编辑。
-
register在 C++11 中被弃用的事实相当有说服力。现代优化编译器没有任何好处。然而,GCC 在非标准 extension 中使用它
标签: c++ c performance optimization compiler-construction