【发布时间】:2021-06-04 08:20:14
【问题描述】:
C++20 有方便的[[likely]]/[[unlikely]] 属性来指导代码生成。例如,您可以指定一个分支很可能被:
if (b) [[likely]] { /*...*/ }
同样,可以在switch 语句中使用这些属性。 . .不知何故? The documentation 建议以下示例(稍微格式化):
switch (i) {
case 1:
[[fallthrough]];
[[likely]] case 2:
return 1;
}
这显然意味着[[likely]]/[[unlikely]] 在case 语句之前。互联网似乎几乎普遍宣传这种用法。
但是,请考虑以下类似代码(我所做的只是将[[likely]] 移动到另一个case):
switch (i) {
[[likely]] case 1:
[[fallthrough]];
case 2:
return 1;
}
这无法在 clang 上编译!虽然这可能与a compiler bug with [[fallthrough]] 有关,但它让我看到了标准。 relevant standard 有以下示例(参见§VII):
鼓励实现针对正在执行的情况进行优化(例如,a 在以下代码中具有值 1):
switch (a) {
case 1: [[likely]]
foo();
break;
//...
}
即属性出现在 case 标签之后,而不是之前。
所以。 . .是哪一个?顺便说一句,我希望标准是正确的,但这实际上是一个提案,而不是真正的标准 AFAICT——它可能已经改变了。而且,我希望文档至少在基本语法方面是正确的——除了它甚至无法编译。
【问题讨论】:
标签: c++ attributes switch-statement c++20 branch-prediction