31

最近、将来の C++11 標準の現在のドラフトを(少しだけ) 読み始めました。

多くの新機能があり、そのうちのいくつかは Boost Lib で既に利用可能です。もちろん、私はこの新しい標準にかなり満足しており、できるだけ早くすべての新機能を試してみたいと思っています。

とにかく、長年の C++ 開発者である何人かの友人とこのドラフトについて話していると、いくつかの心配事が浮かび上がりました。だから、私はあなたに(彼らに答えるために)お願いします:

1) 言語そのもの

この更新は巨大で、単一の標準更新には大きすぎるかもしれません。コンパイラ ベンダーにとって (ほとんどのベンダーがすでにいくつかの機能の実装を開始している場合でも) だけでなく、エンド ユーザーにとっても非常に大きな問題です。

特に、友人から「これは一種の新しい言語だ」と言われました。

  • この更新後、まったく新しい言語と見なすことができますか?
  • 新しい標準に切り替える予定ですか、それとも「古い」標準を維持する予定ですか?

2) 言語の知識

  • 新しい標準によって学習曲線はどのように影響を受けますか?
  • 言語を教えることはより難しくなりますか?
  • 一部の機能は、非常に優れていますが、私には少し「学術的」に思えます (定義としては)。私が間違っている?
  • これらすべての新しい追加機能をマスターするのは悪夢かもしれませんね。
4

11 に答える 11

18

要するに、いいえ、これを新しい言語と見なすことはできません。それは同じ言語、新しい機能です。ただし、0x 標準をサポートするコンパイラを使用している場合は、Boost ライブラリを使用して追加するのではなく、標準で含めるようになります。

新しい標準をサポートするコンパイラを使用している間は、新しい標準を使用する必要はありませんただし、開発中のソフトウェアに特定の制約が存在する場合は、新しい標準を学習して使用する必要がありますが、それはソフトウェアのあらゆる取り組みの制約です。0x 標準がもたらす新機能により、特定の作業がより簡単になり、エラーが発生しにくくなると思います。そのため、新機能が何であるか、および将来の作業のために設計戦略をどのように改善するかを学ぶことは有益です。また、それを使って開発されたソフトウェアで作業するときに、何が起こっているのかを理解し、大きなブーブーを作らないように、それを学ぶ必要があります.

私が「新しい標準に切り替える」かどうかについては、それが新しい標準を学び、適用可能な場合にそれを使用し、生産性を向上させることを意味する場合、はい、私は確かに切り替える予定です. ただし、これが 0x 標準の新機能のみを使用することに限定することを意味する場合は、そうではありません。なぜなら、私の作業の多くは標準より前に記述されたコードに関係しており、新しい機能を使用するためにすべてを再設計することは巨大な仕事になるからです。特徴。それだけでなく、経験がなければ気がつかない新しいバグやパフォーマンスの問題が発生する可能性があります。

C++ の学習は、常にプログラマーにとって挑戦的な旅の 1 つです。言語に新しい機能を追加しても、その構文や効果的な使用方法を習得する難しさは変わりませんが、アプローチは変わります。ポインターとその機能については引き続き学習しますが、スマート ポインターとその管理方法についても学習します。場合によっては、人々は以前とは異なる方法で物事を学ぶようになります。たとえば、人々はまだ初期化の方法を学ぶ必要がありますが、基本的な方法として、Uniform Initialization と Initializer Lists について学習します。場合によっては、範囲の新しい for 構文や関数宣言の auto 戻り値の型を追加すると、理解が容易になるかもしれません。全体的にはそうだと思いますが、

言語の習得は長期的な目標であり、一朝一夕にはできません。C++ のような複雑なものをすぐに習得できると考えるのはばかげています。何かを実際に打ち込むには、練習、経験、およびコードのデバッグが必要です。学問的に学ぶことは 1 つのことですが、その知識を活用することはまったく別のモンスターです。すでに C++ 言語を習得している場合、新しい概念はそれほど大きな負担にはならないと思います。 .

于 2009-05-07T15:16:21.093 に答える
15

1) 言語自体

私の知る限り、C++'03 と C++'0x の間に重大な変更はありません。ここで思いつくのは auto、ストレージ クラス指定子としての使用に関連するものだけですが、セマンティックな意味がなかったので、それが問題になるとは思いません。

標準には他にも非常に必要なアカデミックな修正がたくさんあります。たとえば、メンバー データのレイアウトの記述が改善されています。最後に、マルチコア/CPU アーキテクチャが標準になりつつあるため、メモリ モデルの修正は必須でした。

2) 言語の知識

個人的には、C++ 開発者の 99.9% にとって、新しい言語の方が使いやすいと感じています。具体的には、auto、lambda、constexpr などの機能について考えています。これらの機能により、言語の使用がより楽しくなるはずです。

より高度なレベルでは、より高度なユーザーに役立つ可変個引数テンプレートなどの他の機能があります。

STL を使用したことのない (または聞いたことさえない) 日常の C++ 開発者の数に、私はまだ驚いています。

個人的な観点から、私が新しい標準で少し心配している唯一の機能は、概念の機能です。これは非常に大きな変更であるため、テンプレートで発生したのと同じ問題 (つまり、完全に壊れた実装) は本当に危険です。

投票のためにFDISが出かける投稿を更新します。

たまたま、「概念」は C++ 0x で削除され、C++ 1x で再び取り上げられる予定です。最終的には、コードを壊す可能性のある変更以外にもいくつかのauto変更がありますが、実際には、おそらくかなりまれです。主な違いは、 FDIS (pdf)の付録 C.2 に記載されています。

于 2009-05-07T12:55:26.640 に答える
12

私にとって、最も重要なものの1つは次のとおりです。

unique_ptr + std::move() !

想像:

  1. オーバーヘッドのないスマート ポインター:

    • 参照カウント操作なし
    • 参照カウンター変数用の追加ストレージなし
  2. 移動できるスマートポインター。移動時にデストラクタ/コンストラクタを呼び出さない

これはあなたに何を与えますか?例外なく安全で安価な (ポインター..) コンテナーで、コストはかかりません。コンテナーは memcpy() unique_ptrs のみを実行できるため、通常のポインターをスマート ポインターでラップすることによるパフォーマンスの低下はありません。だから、もう一度:

  1. ポインターを使用できます
  2. 安全です(メモリリークはありません)
  3. それはあなたに何もかかりません
  4. それらをコンテナーに保管することができ、それらを使って「大規模な」移動 (memcpy のような) を安価に行うことができます。
  5. 例外セーフになります

:)

別の観点:

  1. 実際、copy() を使用してオブジェクトのグループを移動する場合、すべてのオブジェクト インスタンスに対してコンストラクターとデストラクタの呼び出しがあります。1kb サイズの 1000 個のオブジェクトをコピーすると、少なくとも 1 回の memcpy() と 2000 回の関数呼び出しが発生します。
  2. 何千もの呼び出しを避けたい場合は、ポインターを使用する必要があります。
  3. しかし、ポインターは危険です。実際のスマート ポインターは役に立たず、他の問題を解決します。
  4. 今のところ解決策はありません。時々、C++ RAII/pointer/valuevars の設計に対して料金を支払う必要があります。しかし、C++0x では、unique_ptr を使用すると、「大規模な」コンストラクター/デストラクタ呼び出しなしで、またポインターを使用するリスクなしに、オブジェクトの「大規模な」移動を行うことができます (はい、実際にはオブジェクトです。ポインターはスマートになるためです)。私にとって、これは本当に重要です。

これは、RAII の利点を失うことなく (ポインターを使用するため) RAII の概念を緩和するようなものです。もう 1 つの側面: unique_ptr() でラップされたポインターは、Java 参照オブジェクト変数に似た多くの側面で動作します。違いは、unique_ptr() は一度に 1 つのスコープにしか存在できないことです。

于 2009-05-07T15:19:52.410 に答える
9

あなたの友人は部分的に正しいですが、ほとんどが間違っています: それは追加機能を備えた同じ言語です。

良いことに、すべての新機能をマスターする必要はありません。標準化団体の主な義務の 1 つは、既存のコードを壊さないことです。そのため、古いスタイルで喜んでコーディングを続けることができます (「C++」アプリケーションを使用しているにもかかわらず、私はまだほとんど C コーダーです : -)。

新しい機能を確認したい場合にのみ、変更点を理解する必要があります。これは、必要に応じて何年にもわたって行うことができるプロセスです。

私のアドバイスは、すべての新機能が高レベルであることを学び (就職の面接で知識が豊富に聞こえるようにするためだけに)、詳細についてはゆっくりと学ぶことです。

于 2009-05-07T12:45:13.013 に答える
8

いくつかの点で、C++0x は現在の C++ よりも教育/学習しやすいはずです。

  • コンテナーをループする - 新しい構文は+ ファンクターやイテレーターを使用して手動でループforするよりもはるかに簡単ですfor_each
  • コンテナの初期化: 配列と同じ構文でシーケンスを初期化できるようになります
  • メモリ管理: out は危険な古いものauto_ptrになり、in は明確に定義されunique_ptrshared_ptr

ラムダは、必然的に他の言語の同等のものよりも複雑ですが、異なるスコープで関数オブジェクトを定義する C++98 プロセスよりも習得が容易です。

于 2009-05-07T14:07:38.543 に答える
7

あなたには一理ありますが、それは常にそうでした。一部のコーダーの生来の保守主義のために、'98 標準から何も組み込まれていない C++ コードがたくさんあります。私たちの中には、名前空間が登場する前std::(実際には名前空間が登場する前) の暗黒時代、誰もが独自の文字列クラスを作成し、ポインターが常に裸で歩き回っていた時代を覚えている人もいます。「最新の C++ スタイル」について話すのには理由があります。以前のスタイルと区別するためです。一部の人々は、そのスタイルのコードを維持または更新する必要があるためです。

新しい言語機能を自分の仕事に適用する際の機会費用の見積もりに対する人々の態度が異なるという理由だけで、どの言語も生き残るために進化する必要があり、進化する言語はユーザーベースが分割されます。

コンパイラの出荷に C++0x が登場したことで、この会話は世界中の開発チームで何度も繰り広げられます。

ヤングスター: ラムダと呼ばれるものを発見しました! そして、それらを使用してコードをより表現力豊かにする方法をたくさん見つけています! 見てください、私はあなたの古い Foo クラスを書き直しました。

オールドスター: 私の古い Foo クラスには何の問題もありませんでした。「クールな」新機能を不必要に使用する言い訳を探しているだけです。なぜあなたは私の人生をそんなに複雑にしようとするのですか? なぜ私は新しいことを学び続けなければならないのですか?私たちは別の戦争を必要としています、それが私たちが必要としているものです。

ヤングスター: あなたは自分のやり方に固執しすぎです、老人、最近は C++ を使うべきではありません... それが私次第だったら -

オールドスター: もし私に任せていたら、PL/1 に固執していたでしょうが、そうではありません... 私の妻はカーターに投票しなければなりませんでした。あなたができることは何もありません.1つまたは2つのラベルstd::transformで私ができないラムダもありませんgoto

于 2009-05-24T08:14:24.023 に答える
4

数か月前、 Bjarne Stroustrupが50 years of C++というタイトルの講演をするのを聞きました。確かに、私は C++ プログラマーではありませんが、彼が 0x を新しい言語とは考えていないように思えました。

于 2009-05-07T14:37:39.233 に答える
3

コンセプトとコンセプト マップは、テンプレート フレームワークの使いやすさを大幅に向上させます。Boost ソースに注いだことがある人なら、私の言いたいことがわかるでしょう。言語にはテンプレートの概念を表現する機能がないため、常にソースからドキュメントに移動します。うまくいけば、Concepts + Duck Typing によって、テンプレート ライブラリへのエントリ ポイントで要件を明示的に宣言できると同時に、汎用コードを記述するときに Duck Typing が提供する自由が得られるという両方の長所が得られます。

C++0x には多くの優れた機能がありますが、そのほとんどは、既存のアイデアを改良または拡張する進化的な変更です。それを「新しい言語」と呼ぶことを正当化するほどの違いはないと思います。

于 2009-05-07T14:51:20.717 に答える
3

それを「新しい言語」と見なせるかどうかは、セマンティクスだと思います。違いはありません。現在の C++ コードと下位互換性があり、より優れた言語です。「同じ言語」と見なすかどうかは問題ではありません。

言語の学習については、言語の学習と使用を容易にするための多くの新機能があることを覚えておいてください。複雑さを増す機能のほとんどは、ライブラリ開発者のみを対象としています。これらの新機能を使用して、機能を知らなくても使用できる、より優れた、より効率的な、使いやすいライブラリを作成できます。変更のいくつかは、実際には既存の機能を簡素化および一般化するものであり、初心者が学習しやすくなっています。

はい、これは大きな更新ですが、現在の C++ 標準に関する 10 年の経験に基づいています。すべての変更が存在するのは、それが必要であることを経験が示しているからです。実際、委員会は非常に慎重で保守的であり、他の膨大な数の言語の改善を拒否しています。ここに追加されているのは、1) 誰もが同意でき、2) 新しい標準を遅らせることなく、時間内に指定できる基本事項のみです。

それは、数人の言語設計者が座って、試してみたい新しい機能についてブレインストーミングを行うだけではありません。

于 2009-05-07T13:52:42.697 に答える