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.
Görev
KolayKodunuzu üç 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: birconstexpralan ve küpünü (n * n * n) döndüren birintişlevitriangularNumber: n'inci üçgensel sayıyı n * (n + 1) / 2 formülünü kullanarak hesaplayan birconstexprişlevi. Bu görevde onu yalnızca derleme zamanı bağlamında çağıracağız ve sonucunu birconstexprdeğişkeninde saklayacağız.sumOfSquares: iki tamsayı alan ve karelerinin toplamını (a*a + b*b) döndüren birconstexprişlevi
Config.h: Derleme zamanı sabitlerini kullanarak bir yapılandırma yapısı oluşturun.Config,constexprvewidtholmak üzere üç tamsayı alan birheightoluşturucuya sahipdepthyapısını tanımlayın. Bunları genel üyeler olarak saklayın. Ayrıca width * height * depth döndürenconstexpradlı birvolume()yöntemi ekleyin.Yapının altında, 10, 20 ve 5 değerleriyle başlatılmış
constexpradlı birDEFAULT_CONFIGglobal sabit oluşturun.main.cpp: Çalışma zamanı değerlerini temsil eden iki tamsayıyı girdiden okuyun.İlk olarak,
constexprdeğ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,
constexpriş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: 25Girdiler 5 ve 12 olduğunda:
Cube of 4: 64
10th triangular number: 55
Default volume: 1000
Cube of 5: 125
Sum of squares: 169Kendin 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;
}
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
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic Konteyner12Modern C++ Özellikleri
Taşıma Semantiği ve R-değerleriMükemmel YönlendirmeDerinlemesine Lambda İfadeleristd::function ve std::bindconstexpr ve constevalYapılandırılmış Bağlamalaroptional, variant, anyKendi başına pratik yap: Online C++ derleyicisi