【问题标题】:Are arithmetic operations on literals in C++ evaluated at compile time?是否在编译时评估 C++ 中文字的算术运算?
【发布时间】:2018-02-18 13:00:26
【问题描述】:

在这里,C# 也有类似的问题:

Are arithmetic operations on literals in C# evaluated at compile time?,

java

Are arithmetic operations on literals calculated at compile time or run time?.

考虑到 C++,是否会在运行时或编译时评估以下计算?第一个是定义内置类型,第二个是作为函数参数。

但请考虑它们用于所有 4 种基本算术运算以及其他内置类型,例如一个int 而不是下面的double

  • double testDouble = 2.0 + 2.0;
  • aUserDefinedType testUserDefinedTypeObject ( aMemberVariable*std::pow(someOtherVariable, 1.0/8.0) );

【问题讨论】:

  • Go ahead and find out。这不是必需的,优化编译器可能/将会这样做。
  • 诸如2.0 + 2.0 之类的常量算术表达式可能会或可能不会在编译期间进行评估。

标签: c++


【解决方案1】:

这取决于您的编译器及其在构建代码时的优化级别。

编译时评估没有内在的保证,但大多数编译器会在打开优化时在编译时评估常量表达式。

还有constexpr,它也可以帮助编译器知道在编译时可以评估什么。

【讨论】:

  • 因此,我认为总是建议事先评估这些表达式,而不是让编译器优先考虑?例如而不是1.0/8.0,写0.125总是更可取?请在 FLOPT 计算数量非常多的情况下考虑这一点。
  • @Kuti 任何现代优化编译器在打开优化后立即在编译时评估类似的琐碎表达式。您应该以最清晰的方式编写代码并信任优化器(它比您更聪明) - a lot 的可读性和编译器所做的微优化 无论如何只会损害可读性。
  • 编译器的一致性参数很重要。像 1./8 这样的精确操作。总是好的,但例如 1./3。取决于舍入模式,因此当编译器支持舍入模式(gcc 的 -frounding-math)时,无法在编译时进行评估。
猜你喜欢
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 2018-05-23
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2011-02-06
相关资源
最近更新 更多