1番目と2番目の暗黙的呼び出しと明示的呼び出しの間に違いはありません。どちらもプロセス仮想アドレス空間のスタックにメモリを割り当てますが、3番目はnewを使用してヒープにメモリを割り当てます。スタック内のメモリの解放はシステムによって管理され、ヒープ内のメモリの割り当てと解放はプログラマが手動で解放する必要があります。
3番目の方法を使用する場合は、次の問題に注意する必要があります。
クラスオブジェクトを作成するには、ポインタの受信、1回の初期化、および複数回の使用が必要です。
新しく作成されたクラスオブジェクトは、使用後に破棄する必要があります
Newは、ヒープスペースを直接使用するオブジェクトを作成し、ローカルでは、スタックスペースを使用するクラスオブジェクトを定義するためにnewを使用しません。
新しいオブジェクトポインタには、関数の戻り値、関数のパラメータなど、さまざまな用途があります。
新しいアプリケーションやメモリの解放のように、頻繁な呼び出しの機会は新しいものには適していません
スタックのサイズはヒープのサイズよりはるかに小さい
スタックはマシンシステムによって提供されるデータ構造であり、コンピュータは最下位レベルでスタックのサポートを提供します。スタックのアドレスを格納するために特別なレジスタを割り当て、スタックをプッシュおよびポップして実行する特別な命令を持ちます。 、スタックの効率が比較的高いことを決定します。ヒープはC / C ++関数ライブラリによって提供され、そのメカニズムは非常に複雑です。
たとえば、メモリの一部を割り当てるために、ライブラリ関数は特定のアルゴリズムに従ってヒープメモリで使用可能な十分なスペースをヒープメモリで検索します(特定のアルゴリズムについては、データ構造/オペレーティングシステムを参照してください)。十分なスペースがありません(おそらくメモリの断片化が原因です))、
システム関数を呼び出して、プログラムデータセグメントのメモリスペースを増やすことができるため、十分なメモリを割り当ててから戻ることができます。明らかに、ヒープの効率はスタックよりもはるかに低いです
#include <iostream>
using namespace std;
class A
{
private:
int n;
public:
A(int m):n(m)
{ }
~A(){}
};
int main()
{
A a(1); //栈中分配
A b = A(1); //栈中分配
A* c = new A(1); //堆中分配
delete c;
return 0;
}
さらに、プログラミング能力を向上させたい場合は、C言語とC ++プログラミングを学んでください。カーブで追い越し、一歩速く!ここでお手伝いできるかもしれません〜
UPは、C / C ++プログラミングの学習に関するビデオチュートリアルをホームページにアップロードしています。興味のある方、または学習している方は、ぜひご覧ください。お役に立てれば幸いです〜
共有(ソースコード、実際のプロジェクトビデオ、プロジェクトノート、基本的な入門チュートリアル)
キャリアを変えてプログラミングを学び、自分で考えるよりも多くの情報を使って学び、成長するパートナーを歓迎します。
プログラミング学習:
プログラミング学習: