問題タブ [stackalloc]
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#でstackallocキーワードを使用する必要があるのはいつですか?
stackalloc
キーワードはどのような機能を提供しますか?いつ、なぜそれを使いたいのですか?
c# - c#コンパイラはstackallocを単独で使用することを決定していますか?
C# コンパイラがヒープではなくスタックに配列を配置することを決定する場合があることを示唆するブログ エントリを見つけました。
スタック割り当てによるパフォーマンスの向上 (.NET メモリ管理: パート 2)
この男は次のように主張しています。
コンパイラは、独自にスタックに置くことを決定することもあります。私は TestStruct2 で実験を行い、安全でないコンテキストと通常のコンテキストの両方を割り当てました。unsafe コンテキストでは配列はヒープに配置されましたが、通常のコンテキストではメモリを調べたところ、配列は実際にはスタックに割り当てられていました。
誰かがそれを確認できますか?
私は彼の例を繰り返そうとしましたが、試行するたびに配列がヒープに割り当てられました。
C#コンパイラが「unsafe」キーワードを使用せずにそのようなトリックを実行できる場合、私は特に興味があります。多くの小さなバイト配列 (長さ 8 ~ 10 バイト) で動作するコードがあるため、新しいバイトごとに [...] ヒープを使用すると、時間とメモリが無駄になります (特に、ヒープ上の各オブジェクトには 8 バイトのオーバーヘッドがあります)。ガベージ コレクターに必要)。
編集:なぜそれが私にとって重要なのかを説明したいだけです
..netコードを動作させることができるGemalto.NETスマートカードと通信するライブラリを書いています. 何かを返すメソッドを呼び出すと、スマート カードは戻り値の正確なタイプを説明する 8 バイトを返します。この 8 バイトは、md5 ハッシュといくつかのバイト配列連結を使用して計算されます。
問題は、私が知らない配列がある場合、アプリケーションにロードされたすべてのアセンブリのすべての型をスキャンし、同じ配列が見つかるまでそれぞれの 8 バイトを計算する必要があることです。
型を見つける他の方法がわからないので、できるだけ高速化しようとしています。
c++ - 奇妙に動作するスタック上の c++ 割り当て
g++ の興味深い点 (他のコンパイラーとかも?):
g++ でコンパイル:
最初のタイプの割り当ては、オブジェクトを構築しません。私は何が欠けていますか?
c++ - PIMPL とスタック割り当て
そこで、PIMPL とスタック割り当てについて考えてみました。私はライブラリを作成しており、PIMPL を使用してクラスのプライベート メンバーを非表示にすることにしました。つまり、このようにクラスを宣言することになります
それはかなり簡単です。しかし、コンストラクターでこれを行います
したがって、誰かが私のライブラリを使用してスタックに Foo を作成する場合、基本的にヒープ割り当てを行っています。これは、PIMPL を使用する際に考慮しなければならないトレードオフですか? コンストラクターの横に警告を表示してドキュメントをリリースすることを考えました:「警告: これにより、ヒープ割り当てが発生します」など。
私のもう 1 つの考えは、純粋な仮想インターフェイスとして実装に公開されるすべてのクラスと、スマート ポインターを返す一連の静的ファクトリ メソッドを用意することでした。これはヒープ割り当ても意味しますが、トリックはありません。
何か考えや提案はありますか?ライブラリを使用するプログラマーに対して、私は過度に配慮していませんか?
c# - intをbyte*に設定する方法C#
バイト*の特定のインデックスでintをバイト*に変換するにはどうすればよいですか?
理想的には、次のようなものが欲しいです。
ビットの最初の部分をigm[4]に設定し、残りをigm[5]に設定します。
編集:私はこれを処理するための多くの可能な方法があるかもしれないことを理解しています、私は可能であれば最も効率的な方法を探しています。
c# - 安全でないコード内の安全なインデックス作成
おはよう、昼も夜も、
序文:以下のコードは、実際には何も役に立ちません。説明のみを目的としています。
安全でないコード内で「セーフモード」の配列を割り当てて使用することに問題はありますか? たとえば、コードを次のように書く必要があります
または、代わりに、ポインターと長さのみをパラメーターとして受け入れる別の安全でないメソッドを作成し、それをメイン関数で使用する必要がありますか?
また、割り当てを置き換える方法はありますか
ポインタとして使用でき、まだ?としてResult
返すことができるようにResult
uint[]
どうもありがとうございました。
c# - C# & .NET: スタックアロク
stackalloc
オペレーターの機能についていくつか質問があります。
実際にどのように割り当てますか?私はそれが次のようなことをすると思った:
しかし、私はいくつかのテストを行いましたが、それがどのように機能するかはわかりません. それが何をどのように行うのかを正確に知ることはできませんが、基本を知りたいです。
ヒープ割り当てよりもスタック割り当ての方が速いと思いました (まあ、確かにそう思います)。では、なぜこの例は:
/li>
スタック割り当ての平均結果は280~ ティック、ヒープ割り当ては通常1 ~ 0 ティックですか? (私のパソコンでは Intel Core i7)。
私が現在使用しているコンピューター (Intel Core 2 Duo) では、結果は以前のものよりも理にかなっています (おそらく、最適化コードが VS でチェックされていないため): スタック割り当てで 460~ ティック、ヒープ割り当てで約380 ティック。
しかし、これはまだ意味がありません。なぜそうなのですか?CLR は配列を使用していないことを認識しているので、配列を割り当てさえしないのではないでしょうか?
c# - stackallocで割り当てられたメモリの初期化
C#stackalloc
でメモリを割り当てている場合、そのメモリは(で)初期化されていますか?
ドキュメントはそれについては述べておらず、正しい金額が予約されていることを示しているだけです。0
私のテストでは、そのようなメモリはデフォルトでに設定されていまし0
たが、それが保証されているわけではありません。
c# - 以前に宣言されたポインターを初期化するためにC#でstackallocを使用することはできませんか?
C#の表記に信じられないほどの癖があることを発見しましstackalloc
た。次のコードを参照してください。
私の意図は、次のような3項式でstackallocを使用することです。
まったく予想外のコンパイラの攻撃は私に大きな衝撃を与えました。誰かがこの奇妙な行動に光を当てることができれば本当にありがたいです。私はmonoと.netの両方でテストしましたが、どちらも機能しません。