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

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

9
スタックポインターが何であるかは理解していますが、何に使用されますか?
スタックポインターはスタックの先頭を指し、スタックの先頭には、 "LIFO"ベースと呼ばれるデータが格納されています。他の誰かの類推を盗むために、それはあなたが一番上に皿を置いて取る皿の積み重ねのようなものです。スタックポインターOTOHは、スタックの一番上の「皿」を指します。少なくとも、x86についてはそうです。 しかし、なぜコンピュータ/プログラムはスタックポインタが指しているものを「気にする」のでしょうか。言い換えれば、スタックポインターを持っていること、およびそれが機能する場所を知っていることの目的は何ですか? Cプログラマが理解できる説明をいただければ幸いです。
11 stack  x86 

2
スタックの制限
最近、OSが異なる3つのデバイスでスタックの制限をテストしました(制限とは、スタックが持つことができるレベルの最大数を意味します)。2^ 16レベルに達するたびに、オーバーフローエラー、および2 ^ 16-1を配置すると、正しく動作します。 だから私の質問は-それは本当ですか?スタックには、定義により最大値2 ^ 16-1がありますか、それともOSに依存しますか?
10 stack 

2
非同期プロセスにスタック構造が使用されていますか?
この質問には、スタックの使用目的を説明するEric Lippertによる優れた回答があります。何年もの間、一般的に言えば、スタックとは何か、どのように使用されるかを知っていましたが、彼の回答の一部は、非同期プログラミングが標準となっている今日、このスタック構造があまり使用されていないのか疑問に思います。 彼の答えから: スタックは、コルーチンのない言語での継続の具体化の一部です。 具体的には、これのコルーチンなし部分は私に不思議に思っています。 彼はここでもう少し説明します: コルーチンは、それらがどこにあったかを記憶し、しばらくの間別のコルーチンに制御を委譲し、後で中断したところから再開することができますが、必ずしも呼び出されたコルーチンの直後ではありません。C#での "yield return"または "await"を考えてください。C#では、次のアイテムが要求されたとき、または非同期操作が完了したときの場所を覚えておく必要があります。コルーチンまたは同様の言語機能を持つ言語では、継続を実装するために、スタックよりも高度なデータ構造が必要です。 これはスタックに関しては優れていますが、スタックが単純すぎてより高度なデータ構造を必要とするこれらの言語機能を処理できない場合、どの構造を使用するかについて未回答の質問が残りますか? 技術が進歩するにつれてスタックはなくなりますか?それを置き換えるものは何ですか?ハイブリッドタイプのものですか?(たとえば、私の.NETプログラムは、非同期呼び出しにヒットするまでスタックを使用し、完了するまで他の構造に切り替えます。その時点で、スタックは、次の項目を確認できる状態に戻されますか? ) これらのシナリオはスタックに対して高度すぎると言うことは完全に理にかなっていますが、スタックを置き換えるものは何ですか?私がこの数年前に知ったとき、スタックは非常に高速で軽量であり、アプリケーションからヒープから離れて割り当てられたメモリの一部であり、手元のタスクの効率的な管理をサポートしていたので(スタックは意図されていましたか?)。何が変わったの?
10 stack 


1
概念的には、各スレッドが独自のスタックを取得すると言われているのはどういう意味ですか?
私が読んでてきたブライアン・ゲッツにより、実際にJavaの並行処理を し、セクション内のスタック閉じ込め、各スレッドは独自のスタックを取得し、そのローカル変数は、本質的に実行中のスレッドに限られていることを述べています。これらは実行中のスレッドスタックに存在し、他のスレッドからはアクセスできません。各スレッドが独自の実行スタックを持っているとはどういう意味ですか?

4
呼び出しスタックは下または上から始まりますか?
スタックは、ボトムアップで積み上げるものです。 したがって、スタックが空になりプログラムが終了するまで各関数が終了するため、関数が呼び出されたときにスタックから新しいアイテムが追加され、呼び出しスタックはスタックに新しいアイテムを追加します。 上記が正しい場合、なぜ人々はコールスタックを「上に」移動するコントロールを参照するのですか?確実に、制御は呼び出しスタックを下に移動します。
10 functions  stack 

8
配列とスタックの違いは何ですか?
ウィキペディアによると、スタック: 後入れ先出し(LIFO)の抽象データ型と線形データ構造です。 一方で、配列: 要素(値または変数)のコレクションで構成されるデータ構造であり、それぞれが少なくとも1つの配列インデックスまたはキーによって識別されます。 私が理解している限り、それらはかなり似ています。では、主な違いは何ですか?それらが同じでない場合、配列がスタックでできないこと、およびその逆ができることは何ですか?

3
良いC可変長配列の例[終了]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 この質問はSOでかなりフリーズしたレセプションを得たので、そこで削除して代わりにここで試すことにしました。ここにも当てはまらないと思われる場合は、少なくとも私が求めている例を見つける方法の提案についてコメントを残してください... C99 VLAを使用することで、現在の標準ヒープを使用するC ++ RAIIメカニズムなどよりも優れた例を挙げていただけますか? 私が後の例は次のとおりです: ヒープを使用するよりも簡単に測定できる(おそらく10%)パフォーマンスの利点を実現します。 アレイ全体をまったく必要としない、適切な回避策はありません。 実際には、最大サイズを固定する代わりに、動的サイズを使用するメリットがあります。 通常の使用シナリオでスタックオーバーフローが発生することはほとんどありません。 C ++プロジェクトにC99ソースファイルを含めるためのパフォーマンスを必要とする開発者を誘惑するのに十分な強さである。 文脈上のいくつかの明確化を追加:C99の意味と、標準C ++に含まれていないように私は、VLAを意味:int array[n]どこn変数です。そして、私はそれが他の標準(C90、C ++ 11)によって提供される代替手段に勝るユースケースの例の後にいます: int array[MAXSIZE]; // C stack array with compile time constant size int *array = calloc(n, sizeof int); // C heap array with manual free int *array = new int[n]; // …
9 c++  c  stack  heap 

2
基本的なスタック操作操作はどれですか?
私はスタック指向の仮想マシンを作成しているので、それがどのように機能するかについての一般的な理解のためにForthを学び始めました。次に、仮想マシンに実装する必要のある重要なスタック操作操作をリストしました。 drop ( a -- ) dup ( a -- a a ) swap ( a b -- b a ) rot ( a b c -- b c a ) 次の4つのスタック操作操作を使用して、他のスタック操作操作をシミュレートできると思います。例えば: nip ( a b -- b ) swap drop -rot ( a b c -- c a b …

2
c / c ++では、ブロックが実行される場合にのみブロックスコープ変数がスタックされますか?
これを仮定します: void func() { ... if( blah ) { int x; } ... } が入るとxすぐにスタックに予約されるスペースですかfunc、それともブロックが実際に実行された場合のみですか? それともコンパイラの選択ですか? CとC ++はこれについて同じように動作しますか?
8 c++  c  stack  allocation 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.