C ++ 14の「constexpr」

DeiDei

そのため、C ++ 14以降constexprconstexpr関数に新しい変数やループを含めるなど、C ++ 11にあった制限はなくなりました

そして、GCCおよびClangコンパイラの最新バージョンはすでにそれらをサポートしています。

したがって、問題はこれです...constexprパラメータとして渡される値が定数である限り、関数は実行中ではなくコンパイル時に計算されます。それで、私が以下に書いた関数の結果は、実行中に即座に現れるはずですよね?しかし、そうではありません。

私の質問は:なぜそれが起こるのですか?そして、私はC ++ 14のconstexpr機能について間違った理解をしていますか?ありがとうございました。

編集:はい、私は使用していました-OO、それがそれが機能しない理由です。しかし、セットアップ-O1またはより高速な最適化がうまくいき、プログラムは期待どおりに実行されます。ご回答ありがとうございます。

#include <iostream>
#include <chrono>

constexpr long long addition(long long num)
{
    long long sum = 0;
    for (int i = 0; i <= num; i++)
    {
        sum += i;
    }

    return sum;
}

int main()
{
    auto start = std::chrono::steady_clock::now();
    //////////////////////////////////////////////

    std::cout << addition(500000000);  //500 mill //executes in 1.957 seconds

    ///////////////////////////////////////////////
    auto stop = std::chrono::steady_clock::now();
    auto dur = std::chrono::duration_cast<std::chrono::milliseconds>(stop - start);
    std::cout << "\n\nIt took " << static_cast<double>(dur.count()) / 1000 << " seconds!";

    std::cin.get();
}
ベン・ヴォイト

constexpr関数は、パラメーターとして渡される値が定数である限り、実行中ではなくコンパイル時に計算されます。

いいえ、コンパイラは、そうではない「純粋」関数の場合と同様に、その裁量でこれを行うことができconstexprます。constexpr変数の初期化など、コンパイル時定数が必要なコンテキストで使用する場合、または配列バインドで使用する場合(ただし、VLA g ++拡張機能に注意)、または非型テンプレート引数として使用する場合を除きます。このような場合、コンパイル時の評価が必要です。(これは完全なリストではありません。switchcaseラベルなど、コンパイル時定数を必要とする他のコンテキストがありますが、caseラベル値をどのように送信しcoutますか?)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

不正な形式、診断不要(NDR):C ++ 14でのConstExpr関数のスロー

分類Dev

C ++ 11/14の静的constとconstexprメンバーフィールド?

分類Dev

odrを使用したc ++ 14 static constexpr auto

分類Dev

このconstexpr仮想関数手法はC ++ 11 / C ++ 14ルールに違反していますか?

分類Dev

C ++ 14:三項式を使用したconstexprからの推定(自動)戻り値の型

分類Dev

C ++ 14 constexprはどのくらいの頻度で使用する必要がありますか?

分類Dev

C ++ 14標準のどこで、非constexpr関数をconstexpr関数の定義で使用できないと書かれていますか?

分類Dev

コンストラクターでのC ++ 14constexprユニオン条件付き初期化

分類Dev

constexpr配列をテンプレートの非型引数として使用する(C ++ 14)

分類Dev

C ++ 14constexpr関数をC ++ 11互換にする

分類Dev

タイプのC ++ constexpr値

分類Dev

C ++ constexpr実現の違い

分類Dev

C ++ 14標準ライブラリのどの部分が可能であり、どの部分がconstexprになりますか?

分類Dev

constではないメンバー関数は、C ++ 14以降の場合にのみconstexprである必要があります

分類Dev

C ++ 14のLambda-Over-Lambda

分類Dev

C ++ 14静的constexprメンバー配列がリンクに失敗する

分類Dev

C ++ 14:パラメーター値からconstexpr変数を初期化する

分類Dev

C ++ constexprキーワードの配置

分類Dev

C ++のconstexprに相当しますか?

分類Dev

C ++のconstexprとは何ですか?

分類Dev

c ++ 11のconstexprコンセプト

分類Dev

C ++のConstexprイテレータ

分類Dev

C ++ 11-constexprのbad_alloc

分類Dev

C ++ 11-constexprのbad_alloc

分類Dev

C ++ 11constexpr互換性の実装

分類Dev

C ++ 14とC ++ 17の違い: `* p ++ = * p`

分類Dev

C ++ 14の末尾の戻り値の型

分類Dev

C ++ 17のconstexpr静的メンバーへのconstexprポインター

分類Dev

C ++ 14でのmain()の法的定義

Related 関連記事

  1. 1

    不正な形式、診断不要(NDR):C ++ 14でのConstExpr関数のスロー

  2. 2

    C ++ 11/14の静的constとconstexprメンバーフィールド?

  3. 3

    odrを使用したc ++ 14 static constexpr auto

  4. 4

    このconstexpr仮想関数手法はC ++ 11 / C ++ 14ルールに違反していますか?

  5. 5

    C ++ 14:三項式を使用したconstexprからの推定(自動)戻り値の型

  6. 6

    C ++ 14 constexprはどのくらいの頻度で使用する必要がありますか?

  7. 7

    C ++ 14標準のどこで、非constexpr関数をconstexpr関数の定義で使用できないと書かれていますか?

  8. 8

    コンストラクターでのC ++ 14constexprユニオン条件付き初期化

  9. 9

    constexpr配列をテンプレートの非型引数として使用する(C ++ 14)

  10. 10

    C ++ 14constexpr関数をC ++ 11互換にする

  11. 11

    タイプのC ++ constexpr値

  12. 12

    C ++ constexpr実現の違い

  13. 13

    C ++ 14標準ライブラリのどの部分が可能であり、どの部分がconstexprになりますか?

  14. 14

    constではないメンバー関数は、C ++ 14以降の場合にのみconstexprである必要があります

  15. 15

    C ++ 14のLambda-Over-Lambda

  16. 16

    C ++ 14静的constexprメンバー配列がリンクに失敗する

  17. 17

    C ++ 14:パラメーター値からconstexpr変数を初期化する

  18. 18

    C ++ constexprキーワードの配置

  19. 19

    C ++のconstexprに相当しますか?

  20. 20

    C ++のconstexprとは何ですか?

  21. 21

    c ++ 11のconstexprコンセプト

  22. 22

    C ++のConstexprイテレータ

  23. 23

    C ++ 11-constexprのbad_alloc

  24. 24

    C ++ 11-constexprのbad_alloc

  25. 25

    C ++ 11constexpr互換性の実装

  26. 26

    C ++ 14とC ++ 17の違い: `* p ++ = * p`

  27. 27

    C ++ 14の末尾の戻り値の型

  28. 28

    C ++ 17のconstexpr静的メンバーへのconstexprポインター

  29. 29

    C ++ 14でのmain()の法的定義

ホットタグ

アーカイブ