constant expression
Főnév
constant expression (tsz. constant expressions)
- (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 |
- constant expression - Szótár.net (en-hu)
- constant expression - Sztaki (en-hu)
- constant expression - Merriam–Webster
- constant expression - Cambridge
- constant expression - WordNet
- constant expression - Яндекс (en-ru)
- constant expression - Google (en-hu)
- constant expression - Wikidata
- constant expression - Wikipédia (angol)