General topics | ||||||||||||||||
Flow control | ||||||||||||||||
Conditional execution statements | ||||||||||||||||
Iteration statements (loops) | ||||||||||||||||
Jump statements | ||||||||||||||||
Functions | ||||||||||||||||
Function declaration | ||||||||||||||||
Lambda function expression | ||||||||||||||||
inline specifier | ||||||||||||||||
Dynamic exception specifications(until C++17*) | ||||||||||||||||
noexcept specifier(C++11) | ||||||||||||||||
Exceptions | ||||||||||||||||
Namespaces | ||||||||||||||||
Types | ||||||||||||||||
Specifiers | ||||||||||||||||
| ||||||||||||||||
Storage duration specifiers | ||||||||||||||||
Initialization | ||||||||||||||||
Expressions | ||||||||||||||||
Alternative representations | ||||||||||||||||
Literals | ||||||||||||||||
Boolean -Integer -Floating-point | ||||||||||||||||
Character -String -nullptr(C++11) | ||||||||||||||||
User-defined(C++11) | ||||||||||||||||
Utilities | ||||||||||||||||
Attributes(C++11) | ||||||||||||||||
Types | ||||||||||||||||
typedef declaration | ||||||||||||||||
Type alias declaration(C++11) | ||||||||||||||||
Casts | ||||||||||||||||
Memory allocation | ||||||||||||||||
Classes | ||||||||||||||||
Class-specific function properties | ||||||||||||||||
| ||||||||||||||||
Special member functions | ||||||||||||||||
Templates | ||||||||||||||||
Miscellaneous | ||||||||||||||||
|
assume (C++23) | ||||
(C++11)(until C++26) | ||||
(C++14) | ||||
(C++17) | ||||
(C++26) | ||||
(C++20) | ||||
(C++17) | ||||
(C++17) | ||||
(C++11) | ||||
(C++20) | ||||
(TM TS) | ||||
(C++20) |
Specifies that the given expression is assumed to always evaluate totrue at a given point in order to allow compiler optimizations based on the information given.
Contents |
[[assume( expression)]] | |||||||||
expression | - | any expression (except unparenthesizedcomma expressions) |
[[assume]] an only be applied to anull statement, as in[[assume(x>0)]];. This statement is called anassumption.
expression iscontextually converted tobool, but it is not evaluated (it is stillpotentially evaluated).
Since assumptions cause runtime-undefined behavior if they do not hold, they should be used sparingly.
One correct way to use them is to follow assertions with assumptions:
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
#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);}
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
CWG 2924 | C++23 | violating an assumption would result in undefined behavior | results in runtime-undefined behavior |
(C++23) | marks unreachable point of execution (function)[edit] |
contract_assert statement(C++26) | verifies an internal condition during execution[edit] |
1. | Clang language extensions doc:__builtin_assume . |
2. | Clang attribute reference doc:assume . |
3. | MSVC doc:__assume built-in. |
4. | GCC doc:__attribute__((assume(...))) . |