C++のクラスは、Delphiのクラスと違って、動的にメモリを確保しなくても使用できることがわかりました。
どういうことかというと、
C++のクラスを使用する場合に、変数宣言すれば、クラスの中のメソッドにアクセスできるということです。
Delphiの場合には、変数宣言をして、動的にメモリを確保(MyClass := TMyClass.Create)としてあげなければなりません。
これはおそらく言語の仕様上、このようになっていると思います。
私としてはどちらがいいかというと、C++の仕様の方がいいのではないかと思います。
このように、言語一つとっても設計思想(ちょっと言い過ぎかも)を理解することで、その言語の作成者の意図などが明確になったりするので、やはり他の言語を学ぶことは重要であると思います。
どういうことかというと、
C++のクラスを使用する場合に、変数宣言すれば、クラスの中のメソッドにアクセスできるということです。
Delphiの場合には、変数宣言をして、動的にメモリを確保(MyClass := TMyClass.Create)としてあげなければなりません。
これはおそらく言語の仕様上、このようになっていると思います。
私としてはどちらがいいかというと、C++の仕様の方がいいのではないかと思います。
このように、言語一つとっても設計思想(ちょっと言い過ぎかも)を理解することで、その言語の作成者の意図などが明確になったりするので、やはり他の言語を学ぶことは重要であると思います。
スタックとヒープに出来たオブジェクトは本質的に同じで、メモリを割当てなくてもクラスを使えるという性質のものではないですね。スタック上に作られたオブジェクトは、スコープアウトするときに自動的にデストラクトされる点がヒープ上に作られたオブジェクトと異なります。
はじめまして。ご指摘の通りです。
ただ、私としては、Delphiの場合には、常にヒープ領域に確保していると思ったので、C++どうして常にヒープ領域ではないのかが疑問です。
C++のメモリアロケータはデフォルトでmalloc()を使用するため、ヒープ上のオブジェクト割当ては空きメモリ検索や同期などで遅いのです。スタック割当てではその問題が一切起こらないという利点が有るため、重要な最適化テクニックになります。
Javaでは世代別GCでエデンが頻繁に整理されているので、ヒープ上のオブジェクト割当ては非常に効率が良くできるようですが、C++では普通はGCが無いため、最適化時にスタック割当てを活用することが重要になります。
ちなみに、C++ではアロケータをカスタマイズできるので、ヒープに取る場合でも効率良くすることはできますし、ヒープ以外にもオブジェクトを作ることができます。
解説ありがとうございます。
どうしても一つの言語のみを使用していると、わからないことは多くあると思います。
他の言語から学んで自分が習得している言語の特性や違いを明確にすると、習得している言語の理解がより深まるのではないかと勝手に思っています。