0Pricing
C++ Academy · Lekcja

constexpr i czas kompilacji

Obliczaj wartości w czasie kompilacji

constexpr i czas kompilacji to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 3 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.

Znaczenie constexpr

constexpr informuje kompilator, że wartość lub funkcja może zostać obliczona w czasie kompilacji, tworząc rzeczywistą stałą znaną na etapie kompilacji.

#include <iostream>

int main() {
    constexpr int size = 4 * 4;   // computed at compile time
    int arr[size];
    std::cout << sizeof(arr) / sizeof(int) << "\n";
}

Funkcje constexpr

Funkcja constexpr może zostać wykonana w czasie kompilacji, gdy otrzyma stałe argumenty, a w przeciwnym razie — w czasie działania programu.

#include <iostream>

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

int main() {
    constexpr int s = square(5);   // compile time
    int n = 6;
    std::cout << s << " " << square(n) << "\n";  // second at runtime
}

Stałe czasu kompilacji w tablicach

Ponieważ wartości constexpr są znane w czasie kompilacji, można ich używać do określania rozmiaru tablic i jako argumentów szablonów.

constexpr a const

const oznacza „nie można zmienić”, a constexpr — „znane w czasie kompilacji”. Każda wartość constexpr jest niejawnie const, ale nie każda wartość const jest constexpr.

#include <iostream>

int main() {
    int x;
    std::cin >> x;
    const int a = x;        // const but runtime value
    constexpr int b = 10;   // compile-time constant
    std::cout << b << "\n";
}

Rekurencyjne constexpr

Funkcje constexpr mogą być rekurencyjne, dzięki czemu kompilator może obliczać na przykład silnie, zanim program zostanie uruchomiony.

#include <iostream>

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

int main() {
    constexpr long f = factorial(5);  // 120 at compile time
    std::cout << f << "\n";
}

Bardziej rozbudowane constexpr we współczesnym C++

Od C++14 funkcje constexpr mogą zawierać pętle, zmienne lokalne i rozgałęzienia, co pozwala obliczać złożone stałe w czasie kompilacji.

#include <iostream>

constexpr int sumTo(int n) {
    int total = 0;
    for (int i = 1; i <= n; ++i) total += i;
    return total;
}

int main() {
    constexpr int s = sumTo(100);
    std::cout << s << "\n";
}

Zmienne constexpr muszą być inicjalizowane w czasie kompilacji

Zmienna zadeklarowana jako constexpr musi mieć inicjalizator, który można obliczyć w czasie kompilacji, w przeciwnym razie program się nie skompiluje.

Korzyści z obliczeń w czasie kompilacji

Obliczenia wykonywane w czasie kompilacji oznaczają zerowy koszt w czasie działania, możliwość używania wartości w kontekstach stałych oraz wcześniejsze wykrywanie błędów.

constexpr i szablony

Wartości constexpr naturalnie współpracują z szablonami i elementem std::array, w przypadku których rozmiary i parametry muszą być stałymi znanymi w czasie kompilacji.

Kiedy obliczenia przechodzą do czasu działania

Jeśli funkcja constexpr otrzyma argumenty, które nie są stałymi, po prostu wykona się w czasie działania jak zwykła funkcja — nie powoduje to błędu.

Preferuj constexpr dla stałych

Używaj constexpr dla rzeczywistych stałych, takich jak rozmiary, wyniki obliczeń matematycznych i tablice wyszukiwania. Jest ono bardziej wyraziste niż const i zapewnia gwarancje czasu kompilacji.

Szybki test

Sprawdź swoją wiedzę na temat constexpr.

Podsumowanie

Dowiedział się Pan, że constexpr umożliwia obliczanie w czasie kompilacji wartości i funkcji, różni się od const (które jedynie zabrania modyfikacji), obsługuje pętle i rekurencję we współczesnym C++ oraz przechodzi do obliczeń w czasie działania, gdy otrzyma dane niebędące stałymi.

Często zadawane pytania

Czy lekcja „constexpr i czas kompilacji” jest bezpłatna?

Tak — pełny tekst „constexpr i czas kompilacji” 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 „constexpr i czas kompilacji”?

Obliczaj wartości w czasie kompilacji Ć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 3 z 4.

Ile czasu zajmuje lekcja „constexpr i czas kompilacji”?

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. Zmienne i parametry const
  2. Funkcje składowe const
  3. constexpr i czas kompilacji
  4. consteval i constinit
← Powrót do C++ Academy