Menu
Coddy logo textTech

constexpr ve consteval

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 87 / 104.

C++, hesaplamaların çalışma zamanı yerine derleme zamanında gerçekleşmesine olanak tanır; bu da performansı önemli ölçüde artırabilir. constexpr anahtar sözcüğü (C++11) ve consteval anahtar sözcüğü (C++20), ifadelerin ne zaman değerlendirileceği üzerinde kontrol sahibi olmanızı sağlar.

constexpr işlevi, sabit bağımsız değişkenler verildiğinde derleme zamanında değerlendirilebilir; ancak sabit olmayan girdilerle çalışma zamanında da çalışabilir:

#include <iostream>

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

int main() {
    constexpr int compileTime = square(5);  // Derleme zamanında değerlendirilir
    
    int x = 7;
    int runtime = square(x);  // Çalışma zamanında değerlendirilir
    
    std::cout << compileTime << "\n";  // 25
    std::cout << runtime << "\n";      // 49
}

Derleme zamanında değerlendirmeyi garanti etmeniz gerektiğinde consteval kullanın. Bir consteval işlevi bir sabit üretmelidir; bu işlevi çalışma zamanı değerleriyle çağırmak derleme hatasına neden olur:

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

int main() {
    constexpr int result = factorial(5);  // OK: 120 derleme zamanında hesaplandı
    
    // int x = 5;
    // int bad = factorial(x);  // ERROR: x bir sabit değil
}

constexpr ifadesini değişkenlerle ve hatta sınıf oluşturucularıyla da kullanarak nesnelerin tamamının derleme zamanında oluşturulmasını sağlayabilirsiniz. Bu, özellikle arama tabloları, yapılandırma değerleri veya programın yürütülmesi sırasında değişmeyen herhangi bir veri için kullanışlıdır.

challenge icon

Görev

Kolay

Kodunuzu üç dosya arasında düzenleyeceksiniz:

  • MathUtils.h: Derleme zamanında çalışan matematik işlevlerinizi tanımlayın.

    Aşağıdaki işlevleri oluşturun:

    • cube: bir constexpr alan ve küpünü (n * n * n) döndüren bir int işlevi
    • triangularNumber: n'inci üçgensel sayıyı n * (n + 1) / 2 formülünü kullanarak hesaplayan bir constexpr işlevi. Bu görevde onu yalnızca derleme zamanı bağlamında çağıracağız ve sonucunu bir constexpr değişkeninde saklayacağız.
    • sumOfSquares: iki tamsayı alan ve karelerinin toplamını (a*a + b*b) döndüren bir constexpr işlevi
  • Config.h: Derleme zamanı sabitlerini kullanarak bir yapılandırma yapısı oluşturun.

    Config, constexpr ve width olmak üzere üç tamsayı alan bir height oluşturucuya sahip depth yapısını tanımlayın. Bunları genel üyeler olarak saklayın. Ayrıca width * height * depth döndüren constexpr adlı bir volume() yöntemi ekleyin.

    Yapının altında, 10, 20 ve 5 değerleriyle başlatılmış constexpr adlı bir DEFAULT_CONFIG global sabit oluşturun.

  • main.cpp: Çalışma zamanı değerlerini temsil eden iki tamsayıyı girdiden okuyun.

    İlk olarak, constexpr değişkenleri oluşturarak derleme zamanı değerlendirmesini gösterin:

    • cube(4) değerini bir constexpr değişkeninde saklayın ve şunu yazdırın: Cube of 4: [value]
    • triangularNumber(10) değerini bir constexpr değişkeninde saklayın ve şunu yazdırın: 10th triangular number: [value]
    • Varsayılan yapılandırmanın hacmini yazdırın: Default volume: [value]

    Ardından, constexpr işlevlerinin iki girdi değerinizi kullanarak çalışma zamanında da çalışabildiğini gösterin:

    • İlk girdiyi cube() işlevine aktararak çağırın ve şunu yazdırın: Cube of [input]: [result]
    • Her iki girdiyi sumOfSquares() işlevine aktararak çağırın ve şunu yazdırın: Sum of squares: [result]

Örneğin, girdiler 3 ve 4 olduğunda:

Cube of 4: 64
10th triangular number: 55
Default volume: 1000
Cube of 3: 27
Sum of squares: 25

Girdiler 5 ve 12 olduğunda:

Cube of 4: 64
10th triangular number: 55
Default volume: 1000
Cube of 5: 125
Sum of squares: 169

Kendin dene

#include <iostream>
#include "MathUtils.h"
#include "Config.h"

using namespace std;

int main() {
    // Girişten iki tamsayı oku
    int input1, input2;
    cin >> input1;
    cin >> input2;
    
    // TODO: Derleme zamanı değerlendirmesini göster
    // cube(4) saklayan bir constexpr değişken oluştur ve yazdır: "Cube of 4: [value]"
    
    // TODO: Create a constexpr variable storing triangularNumber(10)
    // and print: "10th triangular number: [value]"
    
    // TODO: Print the default config's volume: "Default volume: [value]"
    
    // TODO: constexpr fonksiyonların çalışma zamanı kullanımını göster
    // cube() fonksiyonunu input1 ile çağır ve yazdır: "Cube of [input1]: [result]"
    
    // TODO: Call sumOfSquares() with both inputs
    // and print: "Sum of squares: [result]"
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C++ derleyicisi