問題タブ [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.

0 投票する
1 に答える
1099 参照

compile-time - 静的変数へのメモリ割り当て (コンパイル時のメモリ割り当て)

静的変数へのメモリ割り当ては、コンパイル時に行われます。

  1. アプリケーションを何度もコンパイルすると、毎回メモリが割り当てられますか?
  2. もしそうなら、その時までに、それは私のコンピュータの完全なメモリを消費するかもしれません. 実際には、それは決して起こりません。
  3. また、他のコンピューターで同じアプリケーションの実行可能ファイルを実行すると、正常に実行されます。他のコンピューターでコンパイルされた場合、他のコンピューターのメモリで静的変数を見つける方法。
  4. また、同じアプリケーションの多くのインスタンスを起動すると、すべてのインスタンスに対して静的変数のコピーが作成されますか、それとも単一の静的変数がすべてのインスタンスで共有されますか? コピーが作成されると思います。しかし、ここでは、メモリがコンパイル時に割り当てられ、アプリケーションの 1 つのインスタンスがそのメモリを使用できるのではないかと疑っています。そのため、他のインスタンスがその静的変数にどのようにメモリを割り当てるかということです。

    全体として、「コンパイル時のメモリ割り当て」とは実際にはどういう意味ですか?

0 投票する
1 に答える
773 参照

c - コンパイル時に配列サイズを知る必要があります

固定サイズなしで配列を作成する簡単なコードを書きました。コードをコンパイルしてみましたが、gcc正常に動作しています。これが機能する理由を説明してください。コンパイル時に配列サイズを知る必要があります。

これが私が使用したコードです。

0 投票する
1 に答える
183 参照

c - スタックの再割り当てとは何ですか? また、それはいつ行われますか?

スタックの再割り当てが発生する可能性があると述べられています。私はこれを理解していません。setjmp/longjmp の要点はスタックを保存することであり、longjmp で戻ったときに有効になると考えました。コメントは、スタック全体を移動できることを示唆しているようです。これはすべてのポインターを相殺するので、避けるべき理由がわかります。しかし、スタックの再割り当てはいつ行われるのでしょうか? この用語は今まで聞いたことがありません。

0 投票する
1 に答える
118 参照

c++ - クラスのベクトル メンバーをクラス インスタンスと連続させておく

事前にサイズ設定された 2 つの単純なスタックを実装するクラスがあります。これらは、コンストラクターによって事前にサイズ設定された vector 型のクラスのメンバーとして格納されます。これらは小さく、キャッシュ ライン サイズに適したオブジェクトです。これらの 2 つのスタックはサイズが一定で、永続化され、遅延更新されます。多くの場合、計算コストの低いメソッドによって一緒にアクセスされますが、これらのメソッドは何度も (1 秒あたり数万回から数十万回) 呼び出すことができます。

すべてのオブジェクトはすでに良好な状態にあり (コードはクリーンで、本来の動作を実行します)、すべてのサイズは制御されています (ほとんどの場合、結果を含む操作のチェーン全体で 64k から 128K ですが、256k に近づくことはめったにありません。 L2 ルックアップ、多くの場合 L1)。

いくつかの自動ベクトル化が機能しますが、それ以外は全体がシングル スレッド コードです。

クラスは、いくつかのマイナーなものとパディングを除いて、次のようになります。

冗長に耐えてください。私は自分自身を教育し、中途半端な知識で操作していないことを確認しようとしています。

それらに対して実行される操作とそれらの実際の使用を考えると、パフォーマンスは主にメモリ I/O バウンドです。データの最適な配置に関連するいくつかの質問があります。これは Intel CPU (Ivy といくつかの Haswell) であり、GCC 4.4 を使用していることに注意してください。これに関する他の使用例はありません。

コントロールとセグメントの実際のストレージが Curve のインスタンスに隣接している場合、これはキャッシュの理想的なシナリオであると想定しています (サイズに関しては、ターゲット CPU に簡単に収まります)。関連する前提として、ベクトルが Curve のインスタンスから離れていて、それらの間にある場合、メソッドがこれら 2 つのメンバーのコンテンツに交互にアクセスするため、より頻繁にエビクションと L1 キャッシュの再読み込みが行われるというものがあります。

1)それは正しいですか(データは、新しい操作で最初に検索されたアドレスからキャッシュサイズの全体にわたってプルされ、適切なサイズの便利な複数のセグメントではありません)、またはキャッシングメカニズムとキャッシュを誤解していますかラムの複数の小さなストレッチを引っ張って保持できますか?

2)上記に従って、純粋な状況では、すべてのテストは常にクラスのインスタンスと隣接するベクトルで終了しますが、統計的に可能性が高いとはいえ、それはただの運だと思います。通常、クラスをインスタンス化すると、そのオブジェクトのスペースのみが予約され、ベクトルは次に使用可能な空き連続チャンクに割り当てられます。これは、以前にメモリ内に小さな空のニッチが見つかった場合、Curve インスタンスの近くにあるとは限りません。これは正しいです?

3) 1 と 2 が正しい、または機能的に十分に近いと仮定すると、クラス オブジェクト自体がインスタンス化時に十分な大きさであることを確認するためにある種のアロケータを記述し、そこにベクトルをコピーする必要があることを理解しています。私自身とそこからそれらを参照してください。それが問題を解決する唯一の方法である場合は、おそらくそのような方法をハックすることができますが、そのようなことを行うための素晴らしい/スマートな方法がある場合は、恐ろしくハックしたくありません。ベストプラクティスと提案された方法に関する指針は非常に役立ちます(「mallocを使用しないでください。連続しているとは限りません」、私がすでにダウンしているもの:))。

0 投票する
2 に答える
122 参照

c++ - cpp が割り当てていないメモリへのアクセスを許可するのはなぜですか?

cpp では、配列宣言を typename array[size];として使用できます。 または typename *array = new typename[size]; 配列の長さは 'size' で、要素は '0' から 'size -1' までのインデックスが付けられています。

だから私はそれをチェックするためにこの小さなコードを書きました

で、結果はこんな感じ

プログラムがクラッシュするのではなく、ガベージ値を与えるべきではありません。そして、両方の割り当て方法で同じ結果が得られます。検出が困難なバグが増えます。使用している環境やコンパイラなどに関連していますか?

Windows 8.1でTDM-GCC 4.8.1コンパイラを備えたコードブロックIDEを使用していました

前もって感謝します。