我正在学习C编程语言,在一章中我的书向我介绍了常量的概念:
A constexpr symbolic constant must be given a value that is known at compile time
在编译时知道什么值?我们为什么需要它们?
解决方法
A
constant expression表示可以在编译时在编译时(即在程序运行之前,在编译期间)评估的表达式.
常量表达式可用于初始化用constexpr(referring to the C++11 concept)标记的变量.这样的变量为编译器提供了一个提示,即它可以进行编译时评估(并且可以节省宝贵的运行时间),例如:
#include <iostream> constexpr int factorial(int n) // Everything here is known at compile time { return n <= 1 ? 1 : (n * factorial(n - 1)); } int main(void) { constexpr int f = factorial(4); // 4 is also known at compile time std::cout << f << std::endl; return 0; }
如果不提供常量表达式,编译器无法在编译时实际完成所有这些工作:
#include <iostream> constexpr int factorial(int n) // Everything here is known at compile time { return n <= 1 ? 1 : (n * factorial(n - 1)); } int main(void) { int i; std::cin >> i; const int f = factorial(i); // I really can't guess this at compile time.. // thus it can't be marked with constexpr std::cout << f << std::endl; return 0; }
编译时额外工作而不是运行时工作的好处是性能提升,因为编译后的程序可能能够使用预先计算的值,而不必每次都从头开始计算它们.常量表达式越贵,程序获得的收益就越大.