0Pricing
C++ Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. const変数とパラメータ
  2. constメンバ関数
  3. constexprとコンパイル時評価
  4. constevalとconstinit
← C++ Academyに戻る