ホームページ  >  記事  >  バックエンド開発  >  `constexpr` は C 11 の `inline` を意味しますか?

`constexpr` は C 11 の `inline` を意味しますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-03 19:05:29938ブラウズ

Does `constexpr` Imply `inline` in C  11?

C 11 では Constexpr はインラインを意味しますか?

C 11 標準では constexpr 指定子が導入されており、これにより関数と変数を次の時点で評価できるようになります。コンパイル時間。これにより、constexpr と inline の関係について混乱が生じています。

inline 指定子は、関数のインライン展開を実行するようにコンパイラに指示します。これは、関数のコードが、間接的に呼び出される別の関数を作成するのではなく、関数が呼び出されるコードに直接挿入されることを意味します。

constexpr 指定子は、インライン指定子を明示的に意味しません。ただし、C 11 標準では、「constexpr 関数と constexpr コンストラクターは暗黙的にインラインである」(§7.1.5/2) と規定されています。

影響

これは、コンパイラは、constexpr 関数に対してもインライン関数の場合と同じルールに従う必要があります。特に、コンパイラは、関数が非定数引数で呼び出された場合でも、関数をインライン化することがあります。

次の例を考えてみましょう:

<code class="cpp">#include <iostream>
#include <cstdlib>

inline int f(const int x)
{
    return 2*x;
}

int main(int argc, char* argv[])
{
    return f(std::atoi(argv[1]));
}</code>

この例では、関数 f は、定数以外の引数を指定して呼び出されたにもかかわらず、インライン化されています。これは、 f 関数が inline として宣言されているためです。

結論

constexpr 指定子は、明示的に inline 指定子を意味しません。ただし、C 11 標準では、コンパイラが constexpr 関数がインライン関数であるかのように動作する必要があります。これは、コンパイラが、定数以外の引数を指定して呼び出された場合でも、constexpr 関数を安全にインライン化できることを意味します。

以上が`constexpr` は C 11 の `inline` を意味しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。