constexprとコンパイル時評価
コンパイル時に値を計算します
「constexprとコンパイル時評価」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
constexpr とは
constexpr は、値や関数をコンパイル時に評価できることをコンパイラーに伝え、真のコンパイル時定数を生成します。
#include <iostream>
int main() {
constexpr int size = 4 * 4; // computed at compile time
int arr[size];
std::cout << sizeof(arr) / sizeof(int) << "\n";
}constexpr 関数
constexpr 関数は、定数引数を渡した場合はコンパイル時に実行でき、それ以外の場合は実行時に実行できます。
#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
}配列のコンパイル時定数
constexpr の値はコンパイル時に分かっているため、配列のサイズやテンプレート引数として使えます。
constexpr と const の違い
const は「変更できない」を意味し、constexpr は「コンパイル時に分かっている」を意味します。すべての constexpr は暗黙的に const ですが、すべての const が 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";
}再帰的な constexpr
constexpr 関数は再帰を使えるため、プログラムの実行前に階乗のような値をコンパイラーに計算させられます。
#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";
}現代の C++ における、より豊かな constexpr
C++14 以降の constexpr 関数では、ループ、ローカル変数、分岐を使えるため、複雑な定数をコンパイル時に計算できます。
#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";
}constexpr 変数はコンパイル時に初期化する必要がある
constexpr として宣言した変数は、コンパイル時に評価できる初期化子を持たなければなりません。そうでなければプログラムはコンパイルできません。
コンパイル時計算の利点
コンパイル時に計算すると、実行時のコストがゼロになり、定数コンテキストで値を使えるほか、より早くエラーを検出できます。
constexpr とテンプレート
constexpr の値は、サイズやパラメーターにコンパイル時定数が必要なテンプレートや std::array と自然に組み合わせられます。
実行時にフォールバックする場合
constexpr 関数に非定数の引数を渡すと、通常の関数と同じように実行時に実行されます。エラーにはなりません。
定数には constexpr を優先する
真の定数(サイズ、数学的な値、ルックアップテーブル)には constexpr を使ってください。const よりも表現力が高く、コンパイル時の保証を得られます。
確認テスト
constexpr についての理解度を確認します。
まとめ
constexpr によって変数や関数をコンパイル時に評価できること、変更だけを禁止する const との違い、現代の C++ におけるループと再帰のサポート、そして非定数の入力を受け取った場合は実行時にフォールバックすることを学びました。
よくある質問
「constexprとコンパイル時評価」レッスンは無料ですか?
はい。「constexprとコンパイル時評価」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「constexprとコンパイル時評価」で何を学びますか?
コンパイル時に値を計算します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「constexprとコンパイル時評価」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- const変数とパラメータ
- constメンバ関数
- constexprとコンパイル時評価
- constevalとconstinit