gpt4 book ai didi

c++ - constexpr 是新的内联吗?

转载 作者:行者123 更新时间:2023-12-04 14:44:20 25 4
gpt4 key购买 nike

据我所知,c++ 中的 inline 关键字可以追溯到旧的编译器(当时称为“优化编译器”)不能像现代编译器那样优化,所以将函数标记为 inline 告诉编译器这应该被内联,并且作为副作用防止了 ODR 问题。随着编译器变得更好,有人意识到编译器可以比程序员做得更好,因此编译器的 inline 要求更像是大多数(全部?)现代编译器忽略了。

进入 C++11 及后续版本。在我看来, constexpr 似乎处于类似的情况,至少对于它的某些用途,特别是函数和变量。据我了解,它告诉编译器某个函数可能在编译时被评估。但这是编译器应该能够自行解决的问题。一旦编译器在优化方面做得更好,此功能是否也会成为“提示”?

注意:我不是在询问 constexpr 的其他用途,例如 if 语句。我知道这些是必需的。

最佳答案

As I understand it, it tells the compiler that a certain function may be evaluated at compile time.

不是“可能”,而是“可以”。 constexpr关键字不会告诉编译器它可以做什么(它可能在编译时评估它想要的任何东西)。相反,关键字告诉编译器所需的变量或函数质量,特别是它可以在 constant expressions 中使用。 .如果程序不能满足这个要求,编译器会提示(错误或警告)。您会收到比其他情况下更相关的错误消息 - 编译器可以告诉您为什么您的实体不符合编译时评估的条件,因为它知道您的意图是让实体成为编译时常量。

例如,如果您定义了 const unsigned a , 使用 std::array<int, a> 是错误的如果 a 的值在编译时未知。错误可能在 a 的初始化中。 , 或者模板参数应该是 b而不是 a .编译器必须将错误报告为“a 不是常量表达式”并让程序员进行调查。另一方面,如果 a已宣布 constexpr ,编译器反而会提示 a 的值的原因。在编译时不知道,导致调试时间更少。

没有 constexpr ,下面的代码会产生一个可能很弱的错误消息。

{
const unsigned a = foo();
const unsigned b = 42;

std::array<int, a> stuff; // Error: 'a' is not a constant expression.
// ...
}

在声明两个 a 之后和 foo()成为 constexpr ,错误消失。为什么?因为上周你写了foo() ,编译器被告知该函数必须在常量表达式中可用。结果,编译器指出了为什么 foo()无法在编译时进行评估,您立即修复了该错误。那是上周,而执行foo()在你的脑海里仍然很新鲜。不是这周,在做了十几件事之后,包括因为你相信 a 而与编译器争论的时间。必须是常量表达式,因为它是用 foo() 初始化的.

关于c++ - constexpr 是新的内联吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65800964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com