0Pricing
C++ Academy · Lekcja

Funkcje constexpr i if constexpr

Wykonuj kod podczas kompilacji za pomocą constexpr i twórz rozgałęzienia za pomocą if constexpr

Funkcje constexpr i if constexpr to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.

Ewaluacja podczas kompilacji

Słowo kluczowe constexpr informuje kompilator: „oblicz to podczas kompilacji, jeśli to możliwe”. Obliczenia wykonywane podczas kompilacji nie mają kosztu w czasie działania.

Zmienne constexpr

Zmienną constexpr należy zainicjalizować wyrażeniem stałym. Wynik jest ustalany podczas kompilacji.

constexpr int BUFFER_SIZE = 1024;
constexpr double PI = 3.14159265358979;

Funkcje constexpr

Oznacz funkcje jako constexpr, aby mogły być wykonywane podczas kompilacji, gdy zostaną wywołane ze stałymi argumentami.

constexpr int factorial(int n) {
    return (n <= 1) ? 1 : n * factorial(n - 1);
}

constexpr int five_fact = factorial(5);  // computed at compile time

Rezerwa na czas działania

Funkcję constexpr można również wywołać z wartościami ustalanymi w czasie działania — w takim przypadku zostanie wykonana w czasie działania.

int n = read_input();
int result = factorial(n);   // runtime call

Ograniczenia funkcji constexpr

Przed C++14:

  • Tylko jedna instrukcja return
  • Brak pętli
  • Brak modyfikowania lokalnego stanu

C++14 złagodził te ograniczenia, a C++17 i C++20 dodały kolejne możliwości (try-catch, alokację dynamiczną, funkcje wirtualne).

consteval (C++20)

Wymuś ewaluację podczas kompilacji za pomocą consteval. Wywołanie funkcji consteval z argumentami, które nie są stałymi, jest błędem.

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

constexpr int c = square(5);    // OK
int x = 5;
// int r = square(x);            // ERROR

constinit (C++20)

constinit gwarantuje inicjalizację zmiennej podczas kompilacji, ale pozwala modyfikować ją w czasie działania.

if constexpr (C++17)

if constexpr jest rozgałęzieniem wykonywanym podczas kompilacji. Niewybrana gałąź nie jest nawet kompilowana — jest to przydatne w szablonach.

template <typename T>
void print(const T& value) {
    if constexpr (std::is_pointer_v<T>) {
        std::cout << "pointer: " << *value;
    } else {
        std::cout << value;
    }
}

Eliminowanie SFINAE

if constexpr zastępuje złożone wzorce SFINAE przejrzystą logiką warunkową. W połączeniu z traits typów znacznie ułatwia odczytywanie kodu generycznego.

Algorytmy wykonywane podczas kompilacji

Współczesny C++ pozwala pisać zaskakująco złożone algorytmy wykonywane w całości podczas kompilacji — haszowanie napisów, generowanie tablic i proste parsery.

constexpr auto fnv1a(std::string_view s) {
    uint32_t h = 2166136261u;
    for (char c : s) {
        h = (h ^ static_cast<uint8_t>(c)) * 16777619u;
    }
    return h;
}

constexpr auto x = fnv1a("hello");

Szablony i constexpr

Generyczne funkcje constexpr stanowią potężne połączenie — pozwalają pisać elastyczny typowo kod generyczny, który jest obliczany podczas kompilacji.

Diagnostyka

Błędy kompilacji w kodzie constexpr są zgłaszane wraz ze szczegółowymi lokalizacjami. Współczesne kompilatory całkiem dobrze wskazują miejsce powodujące problem.

Szybkie sprawdzenie

Co robi if constexpr, czego nie robi zwykłe if?

Podsumowanie

constexpr umożliwia ewaluację podczas kompilacji; consteval jej wymaga; constinit gwarantuje inicjalizację podczas kompilacji. if constexpr rozgałęzia kod podczas kompilacji — niewybrana gałąź nigdy nie jest tworzona jako instancja, dzięki czemu w wielu przypadkach zastępuje SFINAE.

Często zadawane pytania

Czy lekcja „Funkcje constexpr i if constexpr” jest bezpłatna?

Tak — pełny tekst „Funkcje constexpr i if constexpr” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Funkcje constexpr i if constexpr”?

Wykonuj kod podczas kompilacji za pomocą constexpr i twórz rozgałęzienia za pomocą if constexpr Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C++ Academy?

Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Funkcje constexpr i if constexpr”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?

Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Szablony funkcji i klas — powtórzenie
  2. Specjalizacja szablonów: częściowa i pełna
  3. Szablony wariadyczne i paczki parametrów
  4. Funkcje constexpr i if constexpr
← Powrót do C++ Academy