C++ 属性: assume (自 C++23 起)
来自 cppreference.com
指定表达式在给定点始终会计算为 true。否则,行为未定义。
表达式在任何情况下都绝不能计算为 false。如果表达式可能计算为 false,则它将在整个程序中引入 未定义行为(不仅仅是在假设出现的地方)。它不应被用于代替断言或前提条件。
内容 |
[编辑] 语法
[[assume( 表达式 )]] |
|||||||||
表达式 | - | 一个表达式 上下文转换为 bool,其中表达式必须计算为 true |
[编辑] 说明
表达式 不能是 逗号运算符 表达式,但将表达式括在括号中将允许使用逗号运算符。
表达式 不会被计算(但它仍然是 可能被计算)。
只能应用于空语句,例如 [[assume(x > 0)]];。此语句被称为假设。如果表达式在假设出现的位置不会计算为true,则行为未定义。否则,该语句没有效果。
假设的目的是允许编译器根据给定的信息进行优化。
[edit] 注意
由于假设如果它们不成立会导致未定义行为,因此应谨慎使用。
使用它们的一种正确方法是在断言之后使用假设。
assert(x > 0); // trigger an assertion when NDEBUG is not defined and x > 0 is false [[assume(x > 0)]]; // provide optimization opportunities when NDEBUG is defined
[edit] 示例
#include <cmath> void f(int& x, int y) { void g(int); void h(); [[assume(x > 0)]]; // Compiler may assume x is positive g(x / 2); // More efficient code possibly generated x = 3; int z = x; [[assume((h(), x == z))]]; // Compiler may assume x would have the same value after // calling h // The assumption does not cause a call to h h(); g(x); // Compiler may replace this with g(3); h(); g(x); // Compiler may NOT replace this with g(3); // An assumption applies only at the point where it appears z = std::abs(y); [[assume((g(z), true))]]; // Compiler may assume g(z) will return g(z); // Due to above and below assumptions, compiler may replace this with g(10); [[assume(y == -10)]]; // Undefined behavior if y != -10 at this point [[assume((x - 1) * 3 == 12)]]; g(x); // Compiler may replace this with g(5); }
[edit] 参考
- C++23 标准 (ISO/IEC 14882:2024)
- 9.12.3 假设属性 [dcl.attr.assume]
[edit] 参见
(C++23) |
标记不可到达的执行点 (function) |
[edit] 外部链接
1. | Clang 语言扩展文档:__builtin_assume . |
2. | Clang 属性参考文档:assume . |
3. | MSVC 文档:__assume 内置函数。 |
4. | GCC 文档:__attribute__((assume(...))) . |