7

何年も前、私は C は C++ に比べて完全に純粋であると信じていました。なぜなら、コンパイラは予測できないコードを生成することができなかったからです。私は今、反例にはvolatileキーワードとメモリバリアが含まれていると信じています (マルチプロセッサプログラミングまたはメモリマップされたハードウェアデバイスのデバイスドライバで、プレーンなアセンブリ言語は C コンパイラの最適化よりもさらに純粋です)。

現時点では、C++ コンパイラが実行できる予測不可能なことを列挙しようとしています。C++ について私の心に残る主な不満は、コンパイラが暗黙的に一時オブジェクトをインスタンス化するということですが、これらのケースはすべて予想できると思います。私が考えているケースは次のとおりです。

  • explicitキーワードを使用せずに、クラスがそれ自体以外の型のコピー コンストラクターを定義する場合
  • クラスがオーバーロードされた変換演算子を定義する場合: operator ()
  • 関数が参照ではなく値でオブジェクトを受け入れる場合
  • 関数が参照ではなく値でオブジェクトを返す場合

他にもありますか?

4

3 に答える 3

2

12.2 一時オブジェクト

1 クラス型のテンポラリは、さまざまなコンテキストで作成されます: 右辺値を参照にバインドする (8.5.3)、右辺値を返す (6.6.3)、右辺値を作成する変換 (4.1、5.2.9、5.2.11、5.4) )、例外のスロー (15.1)、ハンドラーの開始 (15.3)、および一部の初期化 (8.5)。

4 完全式の終わりとは異なる時点で一時変数が破棄される状況が 2 つあります。

実際、12.2全体を確認することをお勧めします

現時点では、C++ コンパイラが実行できる予測不可能なことを列挙しようとしています。C++ について私の心に残る主な不満は、コンパイラが暗黙的に一時オブジェクトをインスタンス化するということですが、これらのケースはすべて予想できると思います。

コンパイラは一時変数を暗黙的に作成しません。標準に従います。もちろん、未定義の動作を呼び出す場合を除きます。コピー省略と戻り値の最適化と呼ばれるものがあることに注意してください。これにより、そうでなければ作成される一時変数の数が実際に減少する可能性があります。

于 2010-02-08T14:36:05.613 に答える
2

「予測不可能」とは、「標準に準拠しているが、プログラマーがコードを書くときに期待するものとは異なるもの」を意味すると思いますよね?

明らかではないかもしれませんが、オブジェクトがインスタンス化またはコピーされているコードからわかると思います。わかりにくいかもしれませんが。

一部のものは、(すべて?) コンパイラ ベンダーによって特定の方法で実装されているだけですが、別の方法で実行される可能性があります。たとえば、レイト バインディング (別名、オーバーロードされた仮想メソッドの呼び出し) は、通常、バックグラウンドで関数ポインターを使用して実装されます。これはおそらく最速の方法ですが、別の方法で実行できると思いますが、それは予想外です。私はコンパイラを知りませんが、それは別の方法で行います。

C++ は非常に複雑であるという意味で、予想外のことがたくさんあります。完全な言語を理解している人はほとんどいません。そのため、予期しないこともあなたの知識に依存します。

于 2010-02-08T14:28:44.940 に答える
0

この主題に関連する一般的な落とし穴についての興味深いリンク:

http://www.gotw.ca/gotw/002.htm

于 2010-02-08T17:13:24.543 に答える