エドワードハンズ-C ++

C ++プログラミングと比較するものを探していましたが、1990年にティムバートン監督の映画「エドワードシザーハンズ」を思い出しました



これは郊外の雰囲気で撮影されたピノキオの暗いバージョンです。 この映画では、不気味な男(ジョニー・デップ)がヴァノナ・ライデンを優しく抱きしめようとしていますが、彼の不器用なシザーアームは両方にとって非常に危険です。 彼の顔はすでに深い傷で覆われています。

手の代わりにハサミがあれば、これはそれほど悪くありません。 エドワードには多くの才能があります。たとえば、驚くほど犬を切ることができます!

C ++カンファレンスに参加した後、よく似た考えを覚えます今回はGoing Native 2013のです。昨年は、新しい標準C ++ 11についての熱意と興奮がありました。 今年は、現実のチェックでした。 誤解しないでください:素晴らしい犬のヘアスタイルがたくさんありました(シンプルでエレガントなC ++コードを意味します)が、会議の主な部分は、怪我を防ぎ、偶発的な切断の場合に応急処置を提供する方法についてでした。



小さなホラーショップ。


C ++を使用しない方法について多くの議論があったため、次のような考えに至りました。これは、無能なプログラマーの問題に関するものではなく、C ++を使用することは一般的に間違っています。 ですから、もしあなたが言語の基本を学んでいるだけで、それを使おうとするなら、あなたは運命にあります。

C ++には、下位互換性、特にCとの互換性という言い訳があります。C++のサブセットとしてCを扱うことができます。C++は、実際のアセンブラ言語であり、日常のプログラミングでは、明らかに必要です。 盲目的にC ++に没頭している場合、純粋なポインター、 forループを考えていることになります。これはすべて、本当に愚かな仕事です。

これを行わない方法のよく知られた例は、 mallocを使用してメモリを動的に割り当て、メモリを解放することです。 mallocはバイト数を取得してvoidへのポインターを返します。これをより便利なものにキャストする必要があります。メモリ管理用のより悪いAPIを考えるのは困難です。 以下は、本当に悪い(ただし、nullポインターでアクセスできない場合はほぼ正しい)コードの例です。

struct Pod {
int count;
int * counters;
};
int n = 10;
Pod * pod = (Pod *) malloc (sizeof Pod);
pod->count = n
pod->counters = (int *) malloc (n * sizeof(int));
...
free (pod->counters);
free (pod);
      
      





, ++ , , , .

++ «» malloc free new delete. ++ :

struct Pod {
int count;
int * counters;
};
int n = 10;
Pod * pod = new Pod;
pod->count = n;
pod->counters = new int [n];
...
delete [] pod->counters;
delete pod;
      
      





, , new , . , new ( ? : n?). , - :

class Snd { // Sophisticated New Data (  POD)
public:
Snd (int n) : _count(n), _counters(new int [n]) {}
~Snd () { delete [] _counters; }
private:
int _count;
int * _counters;
};
Snd * snd = new Snd (10);
...
delete snd;
      
      





? ! .

++ , delete.

, malloc new, : , — .

( ), STL- , . , value- . ! Value- - . shared_ptr shared_ptr? ! , : move- rvalue-.

( !). ? . -, . . , , . ( , , ).



++




, ++.

. , . . , ++, , , , — - .

++ . — , , . , . , , .

, .

, . : , ( , ) . ++, .

, 10 « » ++ ( ). , ++, . ++ : mutation, , , .

, — ++ .

, ( ) .

, , , ++ 10 . " , , ++. , , .







( , ), . (. ). , , 20 . ++ . , ++.

, , , . , .

? ++ — . , , : , , . , . , ++ , , , ++ . : , ( ++ ).

, , ( , shared-) . , . , shared- , . , , , , - , , , . , shared-, , , , .

shared_ptr , , . ! , ! : . ++.







8 , : « !»

++ . 2005 . Posix- 1995 . Windows 95, — Windows NT. ++ 2011 .

++ 11 . : , , . , ++ Java ( , Java ). , ++ , . ++ , , .

C++11 , , , . , - , , . — STM (Software Transactional Memory), . STM, , STM . STM , ++ .

task- future ( , deprecated- ++ 14). task- , . , . . . task- , , futures ( ), task' , , , GPU.

Microsoft PPL Intel TBB (, Microsoft AMP ).

, , , 2015 . , , ++ . ++ , , . : data race. — , D.

++ , , . , . ++, , , . , - .

D, , ( ). D — . D . , . : , , .

++ , - .

, - — , .

: , GPU. ++. , , , . — «Parallel and Concurrent Programming in Haskell». ++, , .







, ++ . . , GPU - .



:

  1. Bartosz Milewski, “Resource Management in C++,” Journal of Object Oriented Programming, March/April 1997, Vol. 10, No 1. p. 14-22. unique_ptr, auto_ptr, . auto_vector, auto_ptr.
  2. C++ Report in September 1998 and February 1999 (auto_ptr ).
  3. C++ in Action (still auto_ptr), Addison Wesley 2001. , .
  4. Walking Down Memory Lane, with Andrei Alexandrescu, CUJ October 2005 ( unique_ptr)
  5. unique_ptr–How Unique is it?, WordPress, 2009



All Articles