CodeNebula
C++23coreexpert

[[assume]] Attribute (C++23 Addition)

C++23 · Completing Modern · Compiler flag: -std=c++23

Explanation

Informs the compiler of an assumed condition for optimization, undefined if false.

Real-World Scenario

Optimize a loop in a rendering engine by assuming valid input.

Quick Snippet

snippet.cpp
[[assume(ptr != nullptr)]]; *ptr = 42;

Full Example

assume_attribute.cpp
// CodeNebula - C++23 Example: [[assume]] Attribute
// Compile: g++ -std=c++23 -Wall -Wextra -o example assume_attribute.cpp
// Note: Requires GCC 13+ / Clang 17+ / MSVC 19.35+

// [[assume(expr)]] tells the compiler that 'expr' is true at that point.
// The compiler may use this for optimization. The expression is never evaluated.

#include <iostream>

// The compiler can optimize division knowing x > 0
int fast_divide(int x, int y) {
    [[assume(y > 0)]];
    [[assume(x >= 0)]];
    // Compiler may omit checks for negative values / division by zero
    return x / y;
}

// Assume can help with loop optimization
void process_array(int* data, int size) {
    [[assume(size > 0)]];
    [[assume(size % 4 == 0)]];  // Hint: size is always a multiple of 4

    // Compiler can vectorize this loop more aggressively
    for (int i = 0; i < size; ++i) {
        data[i] *= 2;
    }
}

// Demonstrate with enum-like constraints
enum class Color { Red = 0, Green = 1, Blue = 2 };

const char* color_name(Color c) {
    [[assume(static_cast<int>(c) >= 0 && static_cast<int>(c) <= 2)]];
    switch (c) {
        case Color::Red:   return "Red";
        case Color::Green: return "Green";
        case Color::Blue:  return "Blue";
    }
    return "Unknown";  // Compiler may remove this as unreachable
}

int main() {
    std::cout << "=== [[assume]] Attribute ===" << std::endl;

    std::cout << "fast_divide(100, 7) = " << fast_divide(100, 7) << std::endl;
    std::cout << "fast_divide(42, 6)  = " << fast_divide(42, 6) << std::endl;

    std::cout << "\n=== Array processing with assume ===" << std::endl;
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
    process_array(arr, 8);
    std::cout << "After doubling: ";
    for (int v : arr) std::cout << v << " ";
    std::cout << std::endl;

    std::cout << "\n=== Enum with assume ===" << std::endl;
    std::cout << "Color(0) = " << color_name(Color::Red) << std::endl;
    std::cout << "Color(1) = " << color_name(Color::Green) << std::endl;
    std::cout << "Color(2) = " << color_name(Color::Blue) << std::endl;

    // Note: [[assume]] is purely an optimization hint.
    // Violating the assumption is undefined behavior.
    std::cout << "\nNote: [[assume]] is UB if the condition is false!" << std::endl;

    return 0;
}

/*
Expected output:
=== [[assume]] Attribute ===
fast_divide(100, 7) = 14
fast_divide(42, 6)  = 7

=== Array processing with assume ===
After doubling: 2 4 6 8 10 12 14 16

=== Enum with assume ===
Color(0) = Red
Color(1) = Green
Color(2) = Blue

Note: [[assume]] is UB if the condition is false!
*/
Run command
g++ -std=c++23 -Wall -Wextra -o example assume_attribute.cpp