問題タブ [unsafe]
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#のレイトレーサーに取り組んでいます。私はc++実装からいくつかのトリックを実装することによってまともなレンダリング速度を達成しようとしていますが、問題が発生しています。
レイトレーサーがレンダリングするシーン内のオブジェクトはKdTree構造に格納され、ツリーのノードは配列に格納されます。私が問題を抱えている最適化は、できるだけ多くのツリーノードをキャッシュラインに収めようとしているときです。これを行う1つの方法は、ノードに左側の子ノードへのポインターのみを含めることです。その場合、配列内の左側の子の直後に右側の子が続くことは暗黙的です。
ノードは構造体であり、ツリーの構築中に、静的メモリマネージャークラスによって配列に正常に配置されます。私が木を横断し始めると、最初はうまく機能しているように見えます。次に、レンダリングの初期の時点(毎回ほぼ同じ場所)で、ルートノードの左側の子ポインターが突然ヌルポインターを指しています。配列がヒープ上にあるため、ガベージコレクターが構造体を移動したという結論に達しました。
アドレスをメモリに固定するためにいくつかのことを試みましたが、必要に応じて、アプリケーションの存続期間全体にわたってそれらのどれも持続しないようです。'fixed'キーワードは、単一のメソッド呼び出し中にのみ役立つようであり、'fixed'配列の宣言は、ノードがそうではない単純な型でのみ実行できます。これを行うための良い方法はありますか、それともC#が意図されていなかったものの道をはるかに下っていますか?
ところで、c ++に変更することは、おそらく高性能プログラムにはより良い選択ですが、オプションではありません。
c# - C# の安全でない/修正されたコード
C#コードで「安全でない」と「修正された」を実際に使用するのに適した例を誰かが挙げることができますか? 私は以前にそれで遊んだことがありますが、実際にそれの良い使い方を見つけたことはありません.
このコードを検討してください...
単純に使用するのに比べて...
2 番目は .NET Framework にあるコードで、最初の部分は Microsoft の Web サイトhttp://msdn.microsoft.com/en-us/library/28k1s2k6(VS.80).aspxからコピーしたものです。
組み込みの Array.Copy() は、Unsafe コードを使用するよりも劇的に高速です。これは、2 番目のコードの方が適切に記述されており、1 番目のコードは単なる例にすぎないためかもしれません。それとも、この貧弱な Web 開発者が頭上で何かをいじっているのでしょうか?
c# - C# の固定ステートメント
プロジェクトの 1 つに、次のようなコードがあります。ここで固定ステートメントが必要な理由を誰でも (簡単な英語で) 説明できますか?
c# - プログラムの終了後にスローされる例外 (発生したエラー)
プログラムが閉じられた後にのみ例外をスローするように見えるアプリケーションがあります。そして、それは非常に矛盾しています。(一貫性のないバグがいかに楽しいかは誰もが知っています...)
私の推測では、クリーンアップ プロセス中にエラーが発生しました。しかし、これらのメモリの読み取り/書き込みエラーは、「安全でない」コードの使用法 (ポインタ?) に何か問題があることを示しているようです。
私が興味を持っているのは、これらの状況をデバッグするための最良の方法は何ですか?
既に終了したプログラムをどのようにデバッグしますか?
より大きな問題を分解するための出発点を探しています。
これらのエラーは、いくつかの方法で表示されるようです (実行時、デバッグ時など)。
c# - C# プロジェクトの設定「安全でないコードを許可する」の実際の機能とは
C# プロジェクト設定の [安全でないコードを許可する] がプロジェクト自体の安全でない C# コードにのみ適用されるのか、それともネイティブ C++ DLL でリンクするときにこのオプションを設定する必要があるのか疑問に思っていました。それ自体がネイティブ DLL にリンクするマネージ DLL 内でのリンクについてはどうでしょうか。このオプションは、内部で実際に何をするのでしょうか?
c# - C# アンセーフ コードと生の C++ のどちらが速いか
ビデオフレームのリアルタイム処理を実行する画像処理プログラムを作成しています。これは、OpenCV ライブラリ dll (アンマネージ C++) をラップする Emgu.CV ライブラリ (C#) を使用して C# で記述されています。ここで、独自の特別なアルゴリズムを作成する必要があり、できるだけ高速にする必要があります。
アルゴリズムのより高速な実装はどれですか?
C# で「安全でない」関数を作成する
関数を OpenCV ライブラリに追加し、Emgu.CV を介して呼び出す
C# unsafe は JIT コンパイラを通過するため遅いと思いますが、その違いは大きいのでしょうか?
編集:
VS2008 で .NET 3.5 用にコンパイル
c# - 関数内から安全でないポインタを返すことができるのはなぜですか?
私は最近、実際にこれを行っているオープンソース プロジェクトをいくつか見ました。「int* input = this.someIterator.GetUnsafePtr()」などの関数から安全でないポインタを返します。
私の理解では、これは完全に間違っているに違いありません。安全でないポインターは「固定」ステートメントを介してのみ取得でき、確かに関数内から返されたポインターは固定されなくなり (宣言スコープが「失われます」)、最終的にガベージ コレクションが行われます。
しかし、コンパイラがこれについて警告したことも覚えていないので、実際に「固定されていない」ポインタがいたるところに広がっている可能性がある場合、わざわざ固定ステートメントを使用する必要はありません。
c# - C#でポインター(安全でないコード)を使用する必要がありますか?
C#コードでポインターを使用する必要がありますか?メリットは何ですか?The Man(Microsoft)が推奨していますか?
c# - 固定と安全でないの違いは何ですか
.NET でメモリをロックする方法が 2 つあるのはなぜですか? それらの違いは何ですか?
c# - / unsafeフラグに対応する「プリプロセッサ」シンボルはありますか?
私はWriteableBitmap
C#でを扱っています。現在、安全でないコードブロックを使用して、を介してピクセルに直接アクセスしていWriteableBitmap.BackBuffer
ます。/unsafe
ただし、オプションに依存したくないので、WriteableBitmap.WritePixels
代わりに使用することを検討しています。
プロジェクトファイルへの手動統合を必要とせずに、コンパイルの/ unsafeオプションが使用されたときに使用できるように、「安全でない」バージョンで条件付きでコンパイルする方法はありますか?
要するに、私は次のようなものを探しています。
実行時の検出も優れています。しかし、それは私が常にでコンパイルする必要があることを意味し /unsafe
、それはライブラリコードがプロジェクトファイルの更新を必要とすることを意味し、それはあまり便利ではありません。
基本的には、重要なときに備えて高速バージョンを維持したいのですが、何があっても機能する合理的なバージョンを用意しています。