0

たとえば、行列を表すプログラムを作成したいのですが、行列はベクトルで表され、ベクトル内の各オブジェクトはセルの例を表します。ベクトルこれで、行列を作成するときに、コンストラクターが挿入するセルのリストを受け取ります。マトリックス。リストのサイズはコンパイル時に不明です

ヒープ上のメモリを使用せずにこのマトリックスを作成することに興味があります。言い換えれば、「新規」または「削除」という単語を使用してオブジェクトを作成しない場合、ベクトルに挿入されるオブジェクトの数がわからない場合、それを行う方法はありますか?

4

5 に答える 5

2

new を使用してスタックにメモリを割り当てる、または配置 new 演算子と呼ばれるものを使用して静的ストレージとして使用する特別な方法があります。このバージョンの new では、メモリのチャンクを確保し、特定の変数を格納する場所を new に明示的に伝えます。次のように動作します。

   #include <new>
   int main()
   {
      char buffer[500];  // chunk of memory
      int p*;
      p = new (buffer) int[10];
   }

この特別な new 演算子を使用するには、新しいヘッダーを含める必要があることに注意してください。この場合、自動ストレージを使用しているため、宣言されたブロック (メイン) を離れるとメモリが解放されます。

参考文献:C++ Primer plus. 第9章 420ページ

于 2010-09-16T23:55:42.637 に答える
1

アセンブリ命令を使用してプログラム/関数のスタックフレームを直接(したがってプラットフォームに依存して)操作せずにこれを行う標準的な方法はありません。これは心からお勧めしません。ヒープの使用を妨げているのは何ですか?

于 2010-09-16T23:21:24.637 に答える
1

allocaポインターを取得してから、インプレースnew演算子を使用するために使用します。

void *p = alloca(sizeof(Class));
new (p) Whatever(arguments);

ただし、使用する前にマニュアルページを読んでください! 細心の注意を払ってください。Jim Brissom が言うように、移植性はありません。allocaalloca

する必要はありませんdelete。関数が戻ると、メモリは解放されます

于 2010-09-16T23:22:45.653 に答える
1

方法はありますが、それは非常に限定的で非常に非正統的です。unsigned charメモリプールを形成する静的サイズの配列を作成する必要があります。オブジェクトのリストのサイズには制限があります。そのようなメモリ プールを具体的に対象とするクラス のnew演算子 (および演算子)をオーバーロードする必要があります。delete

とはいえ、このルートに行く正当な理由は本当にありません。

于 2010-09-16T23:24:56.350 に答える
1

ヒープ上のメモリを使用したくない場合、他にどこから取得しますか?

a) システム依存 - オペレーティング システムにメモリの割り当てを依頼できます。しかし、これは悪いスタイル (システム依存) であり、同じ RAM を使用します... 割り当て方法が異なるだけです。たとえば、Windows 32 の ::GlobalAlloc または ::LocalAlloc は、本当に関心がある場合にそのようなことを行います。

b) メモリ マップ ファイル - 十分な RAM がなく、アクセス時間は問題にならないので、質問している場合は興味深いかもしれません。

c) malloc/free などの C 関数を使用してポインターをキャストします。これは、"new" および "delete" キーワードを回避するだけで、ヒープからメモリを取得します。

ただし、新規作成/削除を避けたい理由に関する情報がなければ、何が「良い」解決策かを判断するのは困難です。動的メモリ割り当てが必要です。これら 2 つはそれを行うためのツールです。

より正確な回答が得られるように、質問を説明/言い換えていただけますか?

于 2010-09-16T23:32:37.877 に答える