そのため、C ++ 14以降constexpr
、constexpr
関数に新しい変数やループを含めるなど、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]
コメントを追加