問題タブ [static-memory-allocation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 静的メモリ割り当てと動的メモリ割り当ての違い
静的メモリ割り当てと動的メモリ割り当ての違いは何ですか?
これを例で説明できますか?
c++ - QT - メイン ウィジェット - スタックまたはヒープ?
メイン ウィジェットをスタックまたはヒープのどちらで初期化するかについて、少し混乱しています。「QT 4 を使用した C++ GUI プログラミング」では、メイン ウィジェットはスタック上で初期化されます。詳細を説明する前に、私が何を意味するかを説明します。
おそらく、これは単に安全であるからであり、QT でのメモリ割り当てについて読者を混乱させたくないからでしょう。QObject から継承するオブジェクトの削除を除外すると、読者は QT オブジェクトによるメモリ管理を「忘れる」ことができます。しかし、私の質問は、その方法を好むべきか、それとも次の方法を好むべきかということです。
この質問をする主な理由は、通常、ヒープとスタックを選択するパターンに従うことを好むからです。
- アイテムが大きい場合 -ヒープ
- アイテムが長期の場合 -ヒープ
- それ以外 -スタック
さて、私の質問は 2 つの質問に集約されると思います。
- QWidget は、スタック オーバーフローを恐れるほど大きいですか?
- 平均的なアプリケーションのスタックの大きさは? スタックのオーバーフローをいつ恐れるべきですか (明らかに再帰関数以外)?
QWidget 自体がスタック オーバーフローを引き起こす可能性は低いと認識していますが、もちろん、これは私のアプリケーションで発生する可能性のある他のスタック使用量の上にあります。
c++ - メモリが非常に限られている組み込みシステム内の STL
私は現在、64 KB の SRAM を搭載した ARM Cortex M3 プロセッサを使用して組み込みシステムを構築中です。現時点では、STL コンテナーで決定論的なパフォーマンスを確保する方法を探しています。これには、実行時にメモリ不足にならないようにすることも含まれます。
私は主に、STL コンテナーが動的メモリ割り当てを実行する方法に関心があります。カスタム アロケータを使用して、これらの構造体が確保したプールからメモリを取得することはできますが、構造体の 1 つのインスタンスが別のインスタンスのスペースを占有できないようにするために、構造体ごとに個別のプールをセットアップする必要があります。
私はこのプロジェクトで、メモリの未加工の割り当てに関心がなく、「よく知られている」データ構造 (スタック、キュー、デキューなど) を利用できることを好む他の個人と協力しています。したがって、私は現在、これらの構造を提供するために C 配列のラッパーを構築することを検討しています。これにより、これらのコンテナーをサポートするために必要なメモリーの静的割り当てが可能になり、他の開発者は、コンパイラーによって提供されるコードサイズ情報に基づいて、実行前にインスタンス化したコンテナーのサイズを知ることができます。私の意見では、これにより実行時にメモリ不足の問題が発生しないことが保証され、システム設計が大幅に簡素化されます。
もう 1 つのオプションは、システムの初期化時に STL コンテナーを割り当てることです。初期化期間の後、追加の動的メモリ割り当ては発生しません。ただし、私の知る限り、標準の C++ STL データ構造はこれをサポートしていません。スタックなどのコンテナーを事前に割り当てることができる必要があります (ベクターに似ています)。
標準 C 配列を中心にクラスを構築するという私の提案について、何かコメントをいただければ幸いです。さらに、静的サイズのスタックやキューなど、静的サイズの STL コンテナーをコンパイル時に割り当てる簡単な方法はありますか? (これはベクトルで可能であることは知っていますが、他のものはわかりません)
注: 別の質問 ( Embedded C++ to use STL or not ) を読みましたが、この質問の作成者は、メモリの量 (ARM7 プロセスの使用方法以外) を明らかにしていませんでした。私に似た解決策を検討しています。
2 番目の注意: 一部の開発者にとっては、64 KB の SRAM が大量のメモリに見えるかもしれません。実際、メモリが大幅に少ない AVR プロセッサで開発を行ったことがあるので、この観点は理解できます。しかし、私の現在の (おそらく無知な) 見方からすると、STL コンテナーについて話す場合、64 KB のメモリはそれほど多くはありません。
c++ - 呼び出し先の観点から、メモリが動的か静的かを検出する方法は?
注: ここで「静的文字列」と言うときは、realloc で処理できないメモリを意味します。
こんにちは、私は char * 引数を取るプロシージャを作成しました。メモリが realloc を介して再配置可能/サイズ変更可能でない IF の複製を作成したいと考えています。そのままでは、手順は「重い」文字列プロセッサであるため、静的であるかどうかに関係なく、無知で文字列を複製すると、将来メモリのオーバーヘッド/処理の問題が確実に発生します。
例外ハンドラを使用して静的文字列を変更しようとしましたが、アプリケーションは予告なしに終了します。私は一歩下がって C を見て、「私は感心していません」と言います。私が聞いたことがあれば、それは例外です。
静的変数でreallocを呼び出すために例外ハンドラを使用しようとしました... Glibは、構造体への個人情報を見つけることができないと報告しています(私は確信しています)私は知りませんが、プログラムで明らかにabortを呼び出しますlongjmp/setjmp OR C++ try, catch finally でキャッチできる例外ではないことを意味します。
これを合理的に行う方法があるに違いないと確信しています。たとえば、動的メモリは静的メモリの近くに配置されていない可能性が最も高いため、アドレスからこの情報を漏らす方法があれば...ビンゴになるかもしれません..
C/C++ プリプロセッサに、マクロ引数のソースとタイプを識別できるマクロがあるかどうかはわかりませんが、そうでない場合はかなりばかげているでしょう。マクロ アセンブラは、そのようなことについてはかなり賢いです。堅牢なエラー処理の欠如から判断すると、そうでなくても少し驚かないでしょう。
memory-management - MPMoviePlayerViewController での IOS 割り当ての問題
viewDidLoad の iPad アプリで、最初のビューでビデオをセットアップして、イントロを作成しました。割り当てツールでは、ビデオを実行すると割り当てられたメモリが 120MB まで増加することがわかりますが、気にしませんが、ビデオが終了した後、そのメモリを 0 に戻したいのですが、何が間違っていますか?
}
c++ - 静的に割り当てられた可変サイズ配列はC++でどのように機能しますか?
これはコンパイルされないと思いましたが、実際にはコンパイルされます(g ++コマンドを使用)。
後でわかったことは、標準のC ++が可変サイズの配列をサポートしていない場合でも、GCCは実際には可変サイズの配列を許可しているということです。これは奇妙なことです。int* array = new int[size];
可変サイズ配列を作成する唯一の方法は、またはそれ以上の動的割り当てを使用することであると誰もが言っているのを聞いているからですstd::vector
。GCCはそのコードを許可しないと思いました!
とにかく、私の理論的な質問は、配列がヒープまたはスタック領域myArray
に割り当てられているということです。
c - C で静的割り当てに十分なメモリがない場合はどうなりますか?
メモリを動的に割り当てる場合、たとえば、要求を満たすのに十分なメモリがない場合malloc(1024 * sizeof(char))
、結果のポインタが に設定されます。NULL
などの静的割り当てを満たすのに十分なメモリがない場合はどうなりchar c[1024]
ますか?
stack - メモリを一度静的に割り当てるのと、動的に割り当てるのとでは、どちらが高速ですか?
私は機械工学の大学院生です。私の研究グループには、C++ で記述された社内の有限要素コードがあります。ベクトルと配列の多くのメモリが静的に割り当てられていることに気付きました。たとえば、次のようになります。
Element.h 内
Element.C で
このように、ベクトルはこの関数に到達する最初の要素に対して 1 回だけ割り当てられ、残りのオブジェクトはそのメモリ空間を繰り返し使用します。
コードの開発を始めた最初の人は、C++ よりも C をよく知っていたので、多くのコードがこのように書かれています。
これらのベクトルと配列をグループに静的に割り当てる背後にある考え方は、これらの大きなメモリを一度だけ割り当てて繰り返し使用する方が高速であるということです。有限要素ごとに、または関数が呼び出されるたびに同じ配列を複数回割り当てる必要があるのと比較して (たとえば alloca を使用)。これは本当ですか?本当に速度に大きな違いがあるのですか?
静的メモリ割り当てを維持するか、それを取り除くかを決定するために、これについて結論に達しようとしています。私はこれに対する答えを数週間探していましたが、運がありませんでした。あなたの意見が結論に達するのに役立つことを願っています。
ありがとう。
ヘルナン
c - 静的変数と静的メモリ割り当ての違いは?
経験豊富な C 開発者から、静的変数の概念は静的メモリ割り当ての概念と同じではないと言われました。これは正しいです?もしそうなら、2つの概念の違いは何ですか?
静的メモリ割り当ての正式な定義は何ですか?また、静的変数の正式な定義とどのように違うのですか?
この質問は、これらの概念が C プログラミング言語のみにどのように対応するかについて言及しています。