gpt4 book ai didi

c++ - 在 `[likely]]` 语句中正确使用 C++20/`[[unlikely]]` `switch`

转载 作者:行者123 更新时间:2023-12-03 14:41:08 25 4
gpt4 key购买 nike

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):

implementations are encouraged to optimize for that case being executed (eg. a having the value 1 in the following code):


switch (a) {
case 1: [[likely]]
foo();
break;
//...
}
也就是说,该属性出现在案例标签之后,而不是之前。
所以 。 . .它是哪个?顺便说一句,我希望标准是正确的,但这实际上是一个提案,而不是真正的标准 AFAICT——它可能已经改变了。而且,我希望文档,如果没有别的,至少在基本语法方面是正确的——除了它甚至不能编译。

最佳答案

这两个示例都是有效的,并且 Clang 显示了一个错误。 C++20 最新标准草案中的相关措辞是

[dcl.attr.likelihood]

1 The attribute-tokens likely and unlikely may be applied to labels or statements.


语句和标记语句的相关语法产生式在适当的位置具有属性说明符序列。

[stmt.pre]

statement:
labeled-statement
attribute-specifier-seq expression-statement
attribute-specifier-seq compound-statement
attribute-specifier-seq selection-statement
attribute-specifier-seq iteration-statement
attribute-specifier-seq jump-statement
declaration-statement
attribute-specifier-seq try-block

[stmt.label]

labeled-statement:
attribute-specifier-seq identifier : statement
attribute-specifier-seq case constant-expression : statement
attribute-specifier-seq default : statement

switch (i) {
case 1:
[[fallthrough]];
[[likely]] case 2:
return 1;
}
该属性适用于 case 2:就在
switch (a) {
case 1: [[likely]]
foo();
break;
//...
}
适用于声明 foo(); .

关于c++ - 在 `[likely]]` 语句中正确使用 C++20/`[[unlikely]]` `switch`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66496158/

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