constexpr dan consteval
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 87 dari 104.
C++ memungkinkan komputasi dilakukan saat waktu kompilasi, bukan saat runtime, sehingga dapat meningkatkan performa secara signifikan. Kata kunci constexpr (C++11) dan kata kunci consteval (C++20) memberimu kendali atas kapan ekspresi dievaluasi.
Fungsi constexpr dapat dievaluasi saat kompilasi jika diberi argumen konstan, tetapi juga dapat dijalankan saat runtime dengan input nonkonstan:
#include <iostream>
constexpr int square(int n) {
return n * n;
}
int main() {
constexpr int compileTime = square(5); // Dievaluasi saat compile
int x = 7;
int runtime = square(x); // Dievaluasi saat program berjalan
std::cout << compileTime << "\n"; // 25
std::cout << runtime << "\n"; // 49
}Saat kamu perlu menjamin evaluasi saat kompilasi, gunakan consteval. Fungsi consteval harus menghasilkan konstanta. Memanggilnya dengan nilai saat runtime akan menyebabkan error kompilasi:
consteval int factorial(int n) {
return n <= 1 ? 1 : n * factorial(n - 1);
}
int main() {
constexpr int result = factorial(5); // OK: 120 dihitung saat compile
// int x = 5;
// int bad = factorial(x); // ERROR: x bukan konstanta
}Kamu juga bisa menggunakan constexpr dengan variabel dan bahkan konstruktor class, sehingga seluruh object dapat dibuat saat kompilasi. Ini sangat berguna untuk tabel pencarian, nilai konfigurasi, atau data apa pun yang tidak berubah selama program dijalankan.
Tantangan
MudahKamu akan mengatur kodemu dalam tiga file:
MathUtils.h: Definisikan fungsi matematika yang dievaluasi saat kompilasi.Buat fungsi-fungsi berikut:
cube: fungsiconstexpryang menerimaintdan mengembalikan pangkat tiganya (n * n * n)triangularNumber: fungsiconstexpryang menghitung bilangan segitiga ke-n menggunakan rumus n * (n + 1) / 2. Dalam tugas ini, kita hanya akan memanggilnya dalam konteks waktu kompilasi, dengan menyimpan hasilnya dalam variabelconstexpr.sumOfSquares: fungsiconstexpryang menerima dua bilangan bulat dan mengembalikan jumlah kuadrat keduanya (a*a + b*b)
Config.h: Buat struktur konfigurasi menggunakan konstanta waktu kompilasi.Definisikan struct
Configdengan konstruktorconstexpryang menerima tiga bilangan bulat:width,height, dandepth. Simpan ini sebagai anggota publik. Tambahkan juga methodconstexprbernamavolume()yang mengembalikan width * height * depth.Di bawah struct, buat konstanta global
constexprbernamaDEFAULT_CONFIGyang diinisialisasi dengan nilai 10, 20, dan 5.main.cpp: Baca dua bilangan bulat dari input yang mewakili nilai saat runtime.Pertama, tunjukkan evaluasi waktu kompilasi dengan membuat variabel
constexpr:- Simpan
cube(4)dalam variabel constexpr dan cetak:Cube of 4: [value] - Simpan
triangularNumber(10)dalam variabel constexpr dan cetak:10th triangular number: [value] - Cetak volume konfigurasi default:
Default volume: [value]
Lalu, tunjukkan bahwa fungsi
constexprjuga dapat bekerja saat runtime dengan menggunakan kedua nilai inputmu:- Panggil
cube()dengan input pertama dan cetak:Cube of [input]: [result] - Panggil
sumOfSquares()dengan kedua input dan cetak:Sum of squares: [result]
- Simpan
Contohnya, dengan input 3 dan 4:
Cube of 4: 64
10th triangular number: 55
Default volume: 1000
Cube of 3: 27
Sum of squares: 25Dengan input 5 dan 12:
Cube of 4: 64
10th triangular number: 55
Default volume: 1000
Cube of 5: 125
Sum of squares: 169Coba sendiri
#include <iostream>
#include "MathUtils.h"
#include "Config.h"
using namespace std;
int main() {
// Baca dua bilangan bulat dari input
int input1, input2;
cin >> input1;
cin >> input2;
// TODO: Tunjukkan evaluasi saat compile
// Buat variabel constexpr yang menyimpan cube(4), lalu tampilkan: "Cube of 4: [value]"
// TODO: Buat variabel constexpr yang menyimpan triangularNumber(10)
// lalu tampilkan: "10th triangular number: [value]"
// TODO: Tampilkan volume config bawaan: "Default volume: [value]"
// TODO: Tunjukkan penggunaan fungsi constexpr saat program berjalan
// Panggil cube() dengan input1, lalu tampilkan: "Cube of [input1]: [result]"
// TODO: Panggil sumOfSquares() dengan kedua input
// lalu tampilkan: "Sum of squares: [result]"
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container Generik12Fitur Modern C++
Semantik Pemindahan & RvaluePenerusan SempurnaEkspresi Lambda secara Mendalamstd::function & std::bindconstexpr dan constevalPengikatan Terstrukturoptional, variant, anyLatihan sendiri: Compiler C++ online