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

8
スタックサイズがデフォルトの50倍のスレッドを作成する際の危険は何ですか?
私は現在、非常にパフォーマンスが重要なプログラムに取り組んでいます。リソースの消費を減らすのに役立つ可能性があると考える1つのパスは、ワーカースレッドのスタックサイズを増やして、アクセスするほとんどのデータ(float[]s)を移動できるようにしましたスタック(を使用stackalloc)。 スレッドのデフォルトのスタックサイズは1 MBであることを読んだので、すべてのを移動float[]するには、スタックを約50倍(50 MB〜まで)拡張する必要があります。 これは一般に「安全でない」と見なされており、推奨されないことを理解していますが、この方法に対して現在のコードをベンチマークした後、処理速度が530%向上しました。したがって、私はこれ以上の調査なしにこのオプションを単に通り抜けることはできません。それが私の質問につながります。スタックをこのような大きなサイズに増やすことに関連する危険性(何が問題になる可能性があるのか​​)と、そのような危険性を最小限に抑えるためにどのような予防策を講じる必要がありますか? 私のテストコード、 public static unsafe void TestMethod1() { float* samples = stackalloc float[12500000]; for (var ii = 0; ii < 12500000; ii++) { samples[ii] = 32768; } } public static void TestMethod2() { var samples = new float[12500000]; for (var i = 0; i < 12500000; …
228 c#  .net  memory  stack-memory 

6
多次元配列はどのようにメモリ内でフォーマットされますか?
Cでは、次のコードを使用して、2次元配列をヒープに動的に割り当てることができます。 int** someNumbers = malloc(arrayRows*sizeof(int*)); for (i = 0; i < arrayRows; i++) { someNumbers[i] = malloc(arrayColumns*sizeof(int)); } 明らかに、これは実際には、整数の個別の1次元配列の束へのポインターの1次元配列を作成します。 someNumbers[4][2]; しかし、次の行のように2D配列を静的に宣言すると...: int someNumbers[ARRAY_ROWS][ARRAY_COLUMNS]; ...同様の構造がスタック上に作成されますか、それとも完全に別の形式ですか?(つまり、ポインターの1D配列ですか?そうでない場合、それは何ですか、そしてそれへの参照はどのように理解されますか?) また、私が「システム」と言ったとき、それを理解するために実際に責任があるのは何ですか?カーネル?または、Cコンパイラはコンパイル中にそれを分類しますか?

5
Goでの構造体のスタックとヒープの割り当て、およびガベージコレクションとの関係
私はGoを始めたばかりで、自動変数がスタックに存在し、割り当てられたメモリがヒープに存在するCスタイルのスタックベースのプログラミングと、Pythonスタイルのスタックベースのプログラミングが、スタック上に存在するものだけが、ヒープ上のオブジェクトへの参照/ポインターです。 私の知る限り、次の2つの関数は同じ出力を提供します。 func myFunction() (*MyStructType, error) { var chunk *MyStructType = new(HeaderChunk) ... return chunk, nil } func myFunction() (*MyStructType, error) { var chunk MyStructType ... return &chunk, nil } つまり、新しい構造体を割り当ててそれを返します。 それをCで書いた場合、最初のオブジェクトはヒープにオブジェクトを配置し、2番目のオブジェクトはスタックにオブジェクトを配置します。1つ目はヒープへのポインターを返し、2つ目はスタックへのポインターを返します。これは、関数が戻ったときまでに蒸発していたものであり、これは悪いことです。 Python(またはC#を除く他の多くの現代言語)で記述した場合、例2は不可能でした。 Goガベージは両方の値を収集するので、上記の両方の形式で問題ありません。 引用するには: Cとは異なり、ローカル変数のアドレスを返すことはまったく問題ありません。変数に関連付けられたストレージは、関数が戻った後も存続します。実際、複合リテラルのアドレスを取得すると、評価されるたびに新しいインスタンスが割り当てられるため、これらの最後の2行を組み合わせることができます。 http://golang.org/doc/effective_go.html#functions しかし、それはいくつかの質問を提起します。 1-例1では、構造体はヒープで宣言されています。例2はどうですか?それはCの場合と同じようにスタックで宣言されていますか、それともヒープに移動しますか? 2-例2がスタックで宣言されている場合、関数が戻った後、例2はどのように利用可能のままですか? 3-例2が実際にヒープで宣言されている場合、構造体は参照ではなく値で渡されるのはなぜですか。この場合のポインタのポイントは何ですか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.