C++newでオブジェクトを作成する場合とnewでオブジェクトを作成しない場合の区別解析

2468 ワード

C++には、次のように3つのオブジェクトを作成する方法があることを知っています.
 
  
#include
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;
}


1つ目と2つ目は違いません.1つの暗黙的な呼び出し、1つの明示的な呼び出しです.両方はプロセス仮想アドレス空間のスタックにメモリを割り当てます.3つ目はnewを使用して、スタックにメモリを割り当てます.スタック内のメモリの割り当てと解放はシステムによって管理されます.スタック内のメモリの割り当てと解放はプログラマによって手動で解放されなければなりません.したがって、オブジェクトをスタックに配置するか、スタックに配置するかという問題が発生します.この問題は、スタックとスタック自体の違いと関係があります.
この中にはいくつかの問題があります.スタックとスタックの最大割り当て可能なメモリのサイズ2.スタックとスタックのメモリ管理方式3.スタックとスタックの割り当て効率
まず最初の問題について、一般的にプロセススタックのサイズはスタックのサイズよりはるかに小さく、linuxではulimit-s(単位kb)を使用してプロセススタックの最大割り当て可能なサイズを表示することができます.一般的には8 Mを超えず、2 Mを超えないものもありますが、これは設定できますが、スタックでは発見されます.プロセススタックの最大割り当て可能なサイズはGのレベルで、32ビットシステムが最大2 Gを超えないなど、システムによって異なる場合があります.64はシステムが最大4 Gを超えないため、割り当てられたサイズのメモリが必要な場合はnew、つまりスタックを使用します.
次に、スタックはシステムデータ構造であり、プロセス/スレッドに対して一意であり、その割り当てと解放はオペレーティングシステムによって維持され、開発者が管理する必要はありません.関数を実行すると、関数内のローカル変数のメモリセルがスタック上に作成され、関数の実行が終了すると、これらのメモリセルが自動的に解放されます.スタックメモリ割り当て演算はプロセッサの命令セットに内蔵されており、効率が高く、オペレーティングシステムによってスタックに一定の制限があります.スタック上のメモリ割り当て、動的メモリ割り当てとも呼ばれます.プログラムは実行中にmallocで申請したメモリを使用します.このメモリはプログラマー自身が管理し、その生存期間は開発者がいつ割り当て、どのくらい割り当て、freeでメモリを解放するかを決定します.開発者が管理できる唯一のメモリです.使用の良し悪しは直接システムの性能と安定を決定する.
上からわかりますが、必要なメモリは少ないので、どれだけのメモリが必要かを確認できる場合は、スタックを使ってください.実行時にどれだけのメモリが必要かを知る必要がある場合は、スタックを使用します.
最後に、3つ目の問題に対して、スタックは機械システムが提供するデータ構造であり、コンピュータは底層でスタックにサポートを提供する:専門的なレジスタ格納スタックのアドレスを割り当て、スタックを圧縮してスタックを出るには専門的な命令が実行され、これはスタックの効率が比較的高いことを決定する.スタックはC/C++関数ライブラリで提供され、そのメカニズムは複雑です.例えば、メモリを割り当てるために、ライブラリ関数は、データ構造/オペレーティングシステムを参照できる特定のアルゴリズムに従って、十分なサイズのスペースがない場合、スタックメモリで使用可能な十分なサイズのスペースを検索します.(メモリの断片化が多すぎるためかもしれませんが)、システム機能を呼び出してプログラム・データ・セグメントのメモリ領域を増やすことで、十分なサイズのメモリに分けて返す機会があります.スタックの効率はスタックよりずっと低いことは明らかです.
上から分かるように、スタックを使えばスタックを使う.
 
  
#include
#include  
void main()
{
 int n,*p,i,j,m;
 printf(" ;
");
 printf(" : ");
 scanf("%d",&n);
 p=(int *)calloc(n,sizeof(int));    //
 if(p==0)   {
  printf(" !
"); 
  exit(1); 
 }