タグ付けされた質問 「stack」

LIFO(後入れ先出し)データ構造。

6
Javaのスタックメモリとヒープメモリ
私が理解しているように、Javaでは、スタックメモリはプリミティブとメソッド呼び出しを保持し、ヒープメモリはオブジェクトの格納に使用されます。 クラスがあると仮定します class A { int a ; String b; //getters and setters } aクラスのプリミティブはどこAに格納されますか? ヒープメモリが存在するのはなぜですか?なぜすべてをスタックに保存できないのですか? オブジェクトがガベージコレクションされると、オブジェクトに関連付けられたスタックは破棄されますか?

7
呼び出しスタックに静的な最大サイズがあるのはなぜですか?
いくつかのプログラミング言語で作業してきたので、必要に応じて自動的に拡張するのではなく、スレッドスタックが事前に定義された最大サイズを持っている理由を常に疑問に思っていました。 それに比べて、ほとんどのプログラミング言語に見られる特定の非常に一般的な高レベル構造(リスト、マップなど)は、必要に応じて成長するように設計されていますが、新しい要素が追加され、利用可能なメモリまたは計算の制限によってサイズが制限されます(例:32ビットアドレス指定)。 しかし、最大スタックサイズがデフォルトまたはコンパイラオプションによって事前に制限されていないプログラミング言語やランタイム環境については知りません。これが、プロセスで利用可能なメモリの最小割合だけがスタックに使用されている場合でも、過度の再帰がユビキタススタックオーバーフローエラー/例外を非常に迅速に引き起こす理由です。 ほとんどの(すべてではないにしても)ランタイム環境が、実行時にスタックが成長できるサイズの最大制限を設定するのはなぜですか?
46 stack 

6
2つのキューを使用してスタックを実装する意味は何ですか?
次の宿題の質問があります。 2つのキューを使用して、スタックメソッドpush(x)およびpop()を実装します。 これは私には奇妙に思えます: スタックは(LIFO)キューです 実装に2つのキューが必要な理由がわかりません 私は周りを検索しました: GeeksForGeeks スタックオーバーフロー そして、いくつかの解決策を見つけました。これが私がやったことです: public class Stack<T> { LinkedList<T> q1 = new LinkedList<T>(); LinkedList<T> q2 = new LinkedList<T>(); public void push(T t) { q1.addFirst(t); } public T pop() { if (q1.isEmpty()) { throw new RuntimeException( "Can't pop from an empty stack!"); } while(q1.size() > 1) …
34 java  stack 

6
ネストされた関数呼び出しをインライン化できる場合、プログラムはなぜ呼び出しスタックを使用するのですか?
コンパイラに次のようなプログラムを取らせてはいけません。 function a(b) { return b^2 }; function c(b) { return a(b) + 5 }; それを次のようなプログラムに変換します。 function c(b) { return b^2 + 5 }; これにより、コンピュータがc(b)の返信先アドレスを覚える必要がなくなりますか? プログラムを格納し、コンパイルをサポートするために必要なハードディスク領域とRAMの増加が(それぞれ)呼び出しスタックを使用する理由だと思います。あれは正しいですか?


1
フレームポインターの説明
で組み立てMIPS、スタックポインタのためのレジスタ、およびフレームポインタのための別のレジスタがあります。フレームポインタとは何ですか、その目的は何ですか?スタックポインターとの違いは何ですか?
28 assembly  stack 

6
スタックですべてをより効率的に行うことができるのに、なぜヒープが必要なのですか?
これは実際、昨日私が今日使用するアプリケーションでスタックとヒープの両方が必要な理由について質問したことと、単純な&通過する単一の標準)。 ただし、応答の多くは、ヒープの割り当て/参照を試みるよりも数百(または数千)倍高速であるため、スタックはかけがえのないものであることを示しました。ヒープを廃止すると動的ストレージ割り当てに問題があることはわかっていますが、これを回避する方法はありませんか、またはおそらくスタックを改善して動的メモリ割り当てを処理できるようにする方法はありませんか?
24 stack  heap 

4
スタックに「プッシュ」と呼ばれるものを配置するのはなぜですか?
http://dictionary.reference.comによると 押す 動詞(オブジェクトで使用) それを遠ざけるために力で(物)を押したり、押したりする。 力を働かせて特定の方法で(何か)を動かす 突き出す; ドライブ:何かを脇に寄せる。ドアを開ける。 群衆の中に障害物を押しのけることによって達成または達成します。 拡張または投影させる 推力。 何らかの行動や進路を押したり、促したりするために:彼の母親は彼に仕事を求めた。 このIMOはFIFOキューに適合します。これについての説明はありますか?

4
スタックの使用量は多すぎますか?
最近、CやC ++を書いているときに、Javaの場合とは異なり、それがオプションであるという理由だけで、すべての変数をスタック上で宣言します。 しかし、スタック上で大きなものを宣言するのは悪い考えだと聞いたことがあります。 なぜこれが当てはまるのですか?スタックオーバーフローが関係していると思いますが、なぜ発生するのかはあまりわかりません。 スタック上のものはどれくらい多すぎますか? スタックに100MBのファイルを配置しようとはしていません。文字列バッファーなどとして使用するために、数十キロバイトの配列を配置しようとしています。これはスタックの使用量が多すぎませんか? (重複する場合は申し訳ありませんが、スタックの検索はスタックオーバーフローへの参照を提供し続けます。呼び出しスタックタグさえありません。抽象タグを使用しました。)

2
スタックとヒープのサイズはOSによってどのように制限されますか?
注:特定のOSが回答できるようにする必要がある場合は、Linuxを検討してください。 プログラムを実行するたびに、スタック用の領域とヒープ用の領域を備えた、実行する仮想メモリ空​​間が与えられます。 質問1:スタックとヒープに静的なサイズ制限(たとえば、それぞれ2ギガバイト)がありますか、またはこの制限は動的で、プログラムの実行中にメモリ割り当てに従って変化します(つまり、使用される合計4ギガバイト)両方なので、プログラムがスタックのみを使用する場合、4ギガバイトのスタックを持つことができますか? 質問2:制限はどのように定義されますか?使用可能なRAMメモリの合計ですか? 質問3:テキスト(コード)セクションとデータセクションについてはどうですか、どのように制限されていますか?
21 linux  memory  stack  heap 

4
C / C ++の関数呼び出しのスタックフレームを理解していますか?
スタックフレームがどのように構築され、どの変数(パラメーター)がどの順序でスタックにプッシュされるかを理解しようとしていますか?一部の検索結果は、C / C ++コンパイラが関数内で実行された操作に基づいて決定することを示しました。たとえば、関数が渡されたint値を1だけインクリメントし(++演算子に類似)、それを返すことになっている場合、関数のすべてのパラメーターとローカル変数をレジスターに入れます。 どのレジスタが戻り値または値渡しパラメータに使用されるのか疑問に思っています。参照はどのように返されますか?コンパイラーはeax、ebx、ecx、edxをどのように選択しますか? 関数呼び出し中にレジスター、スタック、およびヒープ参照がどのように使用、構築、および破棄されるかを理解するには、何を知る必要がありますか?
19 c++  c  compiler  stack 

4
TCOがない場合、スタックを爆破することを心配する場合
JVMを対象とする新しいプログラミング言語についての議論があるたびに、必然的に次のようなことを言っている人々がいます。 「JVMはテールコールの最適化をサポートしていないため、大量のスタックの爆発を予測しています」 そのテーマには何千ものバリエーションがあります。 今では、Clojureなどの一部の言語には、使用できる特別な再帰構造があります。 私が理解していないのは、テールコール最適化の欠如がどれほど深刻なのかということです。いつ心配する必要がありますか? 私の混乱の主な原因は、おそらくJavaがこれまでで最も成功した言語の1つであり、JVM言語のかなりの数がかなりうまくいっているように思われるという事実からでしょう。TCOの欠如が本当にあるならばどのようにそれが可能である任意の懸念?

5
組み込みシステムの単一アレイに膨大な量のスタックを割り当てることには欠点がありますか?
通常、一部のデータをグローバルにするか、静的にするか、スタック上に置くかを決定するのに問題はありません(ここでは動的な割り当てがないため、ヒープを使用しません)。このようないくつかのQ / Aも読んだことがありますが、システムメモリに比べて膨大な量のデータが含まれるため、私の質問はより具体的です。 改善しようとしている既存のコード(設計、考えられる問題、パフォーマンスなど)を扱っています。このコードは、RAMが4KBのみの古い8ビットMCUで実行されます。このコードでは、ほぼ1KBのアレイの使用に直面しています(はい、4KB RAMシステムでは1KB)。この配列の各バイトが使用されますが、それは問題ではありません。問題は、この配列は宣言されているファイル内の静的配列であるため、そのライフサイクルはプログラムの配列と同じである(つまり、無限と見なすことができる)ということです。 ただし、コードを読んだ後、この配列には無限のライフサイクルが必要ないことがわかりました。完全に手続き的な方法で構築および処理されるため、使用する関数でのみ宣言できるはずです。この方法ではスタック上にあるため、この1KBのRAMを節約します。 質問:これは良いアイデアでしょうか?設計の観点から、無限/グローバルライフサイクルを必要としない場合、スタックに属します。しかし、これは4KBのうち1KBですが、このようにRAMの25%を割り当てるという欠点はありませんか?(スタックの50%以上になる可能性があります) 誰かがこの種の状況の経験を共有できますか、または誰かがこの配列をスタックに入れない正当な理由について考えますか?技術的な欠点と設計に関するコメントを探しています。 私が意識している唯一のことは、この関数に入るときに実際に1KBのスタックが空いていることを確認する必要があるということです。多分それは私が世話をしなければならないことすべてであり、多分そうではない。

1
レッドゾーンの目的は何ですか?
レッドゾーンは、「割り当てられていない」スタックポインターを超えるメモリ内の固定サイズの領域です。コンパイラは、単純なリーフ関数でその領域にアクセスするためのアセンブリを生成します。 しかし、私はレッドゾーンの本当の利点を見ることはできません。スタックポインタを超えてメモリにアクセスするのは非常に危険であり、データの破損を簡単に引き起こす可能性があります。なぜこれを行うのですか?2つのプロセッサ命令(push ebp、mov ebp esp)を保存しても、実際の速度は上がりません。
12 assembly  stack 

2
償却分析?(最悪の場合の性能保証)
償却分析とは何ですか?また、プログラムで最悪の場合のパフォーマンス保証を達成するのにどのように役立ちますか? 私は、次のテクニックがプログラマーが最悪のパフォーマンス保証を達成するのを助けることができると読んでいました(つまり、私自身の言葉:プログラムの実行時間が最悪のキャストの実行時間を超えないことを保証します): ランダム化アルゴリズム(たとえば、最悪の場合、クイックソートアルゴリズムは2次ですが、入力をランダムに並べると、実行時間が線形であることが確率的に保証されます) 操作のシーケンス(分析では、データとクライアントが実行した操作のシーケンスの両方を考慮する必要があります) 償却分析(パフォーマンス保証を提供する別の方法は、すべてのオペレーションの合計コストをオペレーション数で割って追跡することにより、コストを償却することです。この設定では、平均コストを維持しながら、いくつかの高価なオペレーションを許可できますつまり、少数の高価な操作のコストを、その一部を多数の安価な操作のそれぞれに割り当てることで分散します) 著者は、償却分析を達成する方法の1つの例として、Stackの配列データ構造のサイズ変更の使用に言及しましたが、償却分析とは何か、実際にはどのようにできるかはまだわかりません最悪の結果を達成するために実装か(データ構造?アルゴリズム?) -キャストパフォーマンス保証

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.