Ugrás a tartalomhoz

constant expression

A Wikiszótárból, a nyitott szótárból


Főnév

constant expression (tsz. constant expressions)

  1. (informatika) A constant expression (állandó kifejezés) C++-ban olyan kifejezés, amely már fordítási időben kiértékelhető. Ez azt jelenti, hogy az értéke nem változhat futásidőben, és gyakran optimalizálható a fordító által.



1. constexpr és const közötti különbség

  • const: Az érték futásidőben ismerhető meg, de nem módosítható.
  • constexpr: Az értéknek fordítási időben ismertnek kell lennie.

🔹 Példa const-ra:

const int x = 10;  // Nem módosítható, de lehet, hogy futásidőben állítják be.

🔹 Példa constexpr-re:

constexpr int y = 20;  // Fordítási időben ismert, gyorsabb lehet.

💡 Fontos: Minden constexpr változó automatikusan const is!



2. constexpr függvények

C++11-től kezdve definiálhatunk olyan függvényeket, amelyeket fordítási időben lehet kiértékelni.

🔹 Példa egy constexpr függvényre:

constexpr int square(int x) {
    return x * x;
}

int main() {
    constexpr int a = square(5);  // Fordítási időben kiértékelődik
    int b = 6;
    int c = square(b);  // Lefordul, de futásidőben számolja ki
}
  • Ha a bemenet szintén constexpr, akkor a fordító előre kiszámítja.
  • Ha a bemenet nem constexpr, akkor a függvény futásidőben fog lefutni.



3. constexpr osztályok és konstruktoraik

C++14-től már constexpr osztályokat és konstruktoraikat is használhatjuk.

🔹 Példa egy constexpr osztályra:

struct Point {
    constexpr Point(int x, int y) : x(x), y(y) {}
    int x, y;
};

constexpr Point p1(3, 4);  // Fordítási időben létrejön

4. consteval – Kötelező fordítási időben értékelődés (C++20)

C++20 bevezette a consteval kulcsszót, amely biztosítja, hogy egy függvény csak fordítási időben futhasson.

🔹 Példa consteval függvényre:

consteval int cube(int x) {
    return x * x * x;
}

int main() {
    constexpr int d = cube(3);  // OK, mert fordítási időben számolható
    // int e = cube(5);  // HIBA! Nem fordítási időben hívjuk meg
}

💡 consteval garantálja, hogy a függvény soha nem futhat futásidőben.



5. constinit – Nem változó, de futásidőben inicializálható (C++20)

A constinit biztosítja, hogy egy változó csak egy fordítási időben ismert értékkel inicializálható, de nem lesz constexpr.

🔹 Példa constinit-re:

constinit int value = 42;  // Fordítási időben ismert, de nem constexpr

Ha egy változó constinit, akkor statikus változóként inicializálódik, és biztosan van kezdőértéke.



Összegzés

Kulcsszó Fordítási időben ismert? Futásidőben módosítható? Megjegyzés
const Nem feltétlenül Nem Lehet futásidőben ismert értéke
constexpr Igen Nem Lehetőleg fordítási időben kell kiszámítani
consteval Igen (kötelező) Nem Csak fordítási időben működik
constinit Igen Igen Nem constexpr, de statikusan inicializált