编程C++嵌入式开发者

请说说C++中链接时和编译时常量性是如何工作的。constexpr和const之间有什么区别?什么时候使用哪一个?

用 Hintsage AI 助手通过面试

回答。

在C++中,存在编译时(compile-time)和链接时(link-time)常量性。

  • const变量是一个在初始化之后无法修改的对象。但const并不总是保证值在编译时已知;它可能只能在运行时计算。
  • constexpr保证表达式或函数将在编译时计算。

示例:

const int x = time(0); // const,但不是constexpr:值在运行时计算 constexpr int y = 2 + 2; // constexpr:在编译时已知 constexpr int square(int x) { return x * x; } int arr[square(3)]; // 数组大小是编译时表达式

对于需要在编译器中可用的常量表达式,例如数组的大小或模板参数,请使用constexpr

有陷阱的问题。

声明为constexpr的函数可以用非常量参数调用吗?

回答: 可以!如果参数在编译时已知,结果将在编译时计算。如果参数只能在运行时确定,函数将像普通函数一样计算。

constexpr int double_val(int x) { return x * 2; } int val = std::rand(); int result = double_val(val); // 在运行时调用

由于对主题细微差别的不了解而导致的实际错误示例。


故事

其中一个模块通过const int设置数组的大小,以为这是编译时常量。在另一种编译器上导致了错误,因为值是在运行时计算的,数组的大小不符合标准。


故事

在哈希计算中,编译器无法优化计算,因为使用了const变量而不是constexpr。结果:在新的版本中性能下降超过2倍。


故事

在迁移到现代标准时混淆了关键字,将函数声明为const而不是constexpr,导致无法在编译时表达式的模板中使用结果。快速诊断显示了错误,但在审查时被合并到了主分支中。