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

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

c# - Transparency Blend を使用して小さなビットマップを大きなビットマップにコピーする: graphics.DrawImage(smallBitmap, x , y) よりも高速なのは何ですか?

私は、この呼び出しが高圧機能のボトルネックであると特定しました。

小さな半透明のビットマップをより大きな半透明のビットマップにブレンドするより速い方法はありますか?

使用例:

DrawImage 呼び出しは小さな 32bppPArgb ビットマップを取得し、さまざまな場所でそれらを大きなビットマップにコピーします。小さなビットマップは、大きなビットマップの可視領域に部分的にしか重ならない場合があります。両方の画像には、出力にとって重要な方法で DrawImage によってブレンドされる半透明のコンテンツがあります。私は BitBlt でいくつかのテストを行いましたが、大幅な速度の向上は見られず、私のテストではアルファ ブレンディングが同じ結果になりませんでした。私は、bitblt や安全でない C# コードへのより適切な呼び出しを含む、ほぼすべてのメソッドに対してオープンです。

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

c# - C#. 安全でないコールバックからマネージド コードにメッセージを渡す方法は?

安全でないコールバックからマネージド コードにメッセージを渡す方法の簡単な例はありますか?

構造体にパックされたいくつかのメッセージを受信する独自​​の dll があり、すべてがコールバック関数に送られます。

以下に使用例を示しますが、unsafe コードも呼び出します。すべてマネージ コードであるアプリケーションにメッセージを渡したいと考えています。

*PS 相互運用や安全でないコードの経験はありません。私は 8 年前に C++ で開発していましたが、その悪夢のような時代のことはほとんど覚えていません :)

PPS アプリケーションは地獄のように読み込まれます。元の開発者は、1 秒あたり 200 万メッセージを処理すると主張しています。最も効率的なソリューションが必要です。*

ありがとうございました。

0 投票する
4 に答える
8268 参照

c# - C# メモリ管理: 安全でないキーワードとポインター

C#でunsafeキーワードを使用してポインターを使用すると、どのような結果(正/負)になりますか? たとえば、ガベージ コレクションはどうなるか、パフォーマンスの向上/低下は何か、他の言語と比較してパフォーマンスの向上/低下はどのようなものか、手動メモリ管理はどのような危険性があるか、どのような状況でこの言語を使用することが本当に正当化されるか機能、コンパイルに時間がかかります...?

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

c# - AccessViolationException、保護されたメモリを読み書きしようとしました

特定のハードウェアと対話するためのアンマネージ コードを含む dll を使用しており、C# から使用しようとしていますが、AccessViolationException が引き続き発生します。

何が原因で、どうすれば修正できますか?

0 投票する
4 に答える
6644 参照

c# - C# void* を byte[] に変換する

C# では、理想的には追加のバッファーなしで、ストリームに T[] を書き込む必要があります。T[] (T はオブジェクトのない構造体) を void* に変換し、メモリ内で修正する動的コードがあり、うまく機能します。ストリームがファイルだったときは、ネイティブ Windows API を使用して void * を直接渡すことができましたが、今は byte[] を受け取る汎用 Stream オブジェクトに書き込む必要があります。

質問:実際にはヒープ割り当てを持たず、既存の (そして固定された) ヒープ位置を指すダミー配列オブジェクトを作成するハック方法を誰か提案できますか?

これは私が必要とする疑似コードです:

更新:この記事fixed(void* ptr=&buffer)で詳細な 方法を説明しました。私はいつでもバイト[]を作成し、それをメモリ内で修正し、あるポインターから別のポインターへの安全でないバイトコピーを実行し、その配列をストリームに送信することができましたが、不要な余分な割り当てとコピーを避けることを望んでいました.

不可能? さらに考えてみると、byte[] には、配列の次元と要素の型を含むいくつかのメタデータがヒープに含まれています。T[] への参照 (ポインター) を byte[] として渡すだけでは、ブロックのメタデータが T[] のままであるため、機能しない場合があります。また、メタ データの構造が同一であっても、T[] の長さは byte[] よりもはるかに短くなるため、マネージ コードによるその後の byte[] へのアクセスは、正しくない結果を生成します。

機能要求 @ Microsoft Connectこの要求に 投票してください。MS が耳を傾けてくれることを願っています。

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

c# - C#カスタムストリームライター風のクラスの実装

独自のストリームマニピュレータクラスを作成するにはどうすればよいですか?

基本的に、私が頭を包み込もうとしているのは、基になるストリームへの参照をライターに格納することです。たとえば、StreamWriterを使用してメモリストリームに書き込む場合、Write()が作成されると、基になるメモリストリームが書き込まれます。

ポインターや安全でないコードを使用せずに、基になるストリームへの参照を保存できますか?ただの文字列だったとしても、「書きたい」と思っていました。

実際、これはストリームライターとはほとんど関係がなく、参照をクラスに格納する方法を考えています。StreamWriterは、私がこのために思いついた最良の例でした。

0 投票する
6 に答える
2657 参照

c# - C#の巨大なサイズの2次元配列

20000を超えるアイテムが連続しているC#WinFormsで正方行列を宣言する必要があります。32ビットで約2GBの.Netオブジェクトのサイズ制限を読み、64ビットOSでも同じケースを読みました。だから私が理解したように、単一の答えは、安全でないコードまたはC++コンパイラで構築された別のライブラリを使用することです。

ushort [20000,20000]は2GBよりも小さいので、私にとっての問題は価値がありますが、実際には700MBのメモリを割り当てることさえできません。私の制限は650MBですが、その理由がわかりません。32ビットのWinXPと3GBのメモリがあります。Marshal.AllocHGlobal(700 << 20)を使用しようとしましたが、OutOfMemoryExceptionがスローされ、メモリを割り当てようとする前にGC.GetTotalMemoryが4.5MBを返します。

多くの人が安全でないコードを使用すると言っているだけですが、ヒープ内で2次元配列を宣言する方法(どのスタックもそれほど大量のデータを保持できない)とポインターを使用してそれを操作する方法の例を見つけることができません。安全でない{}ブラケット内の純粋なC++コードですか?

PS。なぜこんなに巨大な配列が必要なのかと聞かないでください...しかし、必要に応じて、テキスト(本など)を分析し、多くのインデックスを見つける必要があります。だから答えは-単語間の関係の行列

編集:誰かが安全でないコードでポインタを使用して行列を操作する小さな例を提供していただけませんか。32ビット未満ではより多くのスペースを割り当てることは不可能であることを私は知っていますが、私はそのような例をグーグルで検索することに多くの時間を費やし、何も見つかりませんでした

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

uikit - UIImageのピクセルアルファ値の取得(MonoTouch)

この質問は1042830と重複していますが、MonoTouch固有です。IntPtrを割り当て、CGBitmapContextを使用してそれに描画し、適切なオフセットでバイトを読み取るよりも安全な方法はありますか?

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

c# - C# で部分配列参照を作成します (unsafe を使用しますか?)

現在使用しているライブラリをリファクタリングしていますが、次の問題に直面しています。

以前は次のものがありました。

さまざまな理由から、このギザギザ配列バージョンを 1 次元配列バージョンに置き換え、内部配列を連結しました。私の質問は:どうすればサブ配列への参照を返すことができdataますか?

私は安全でないものやポインターが役立つかもしれないと考えていましたが、それは可能ですか?

0 投票する
4 に答える
5406 参照

c# - C# ジェネリック配列とその数値演算

私は現在、非常に大量の画像を扱うプロジェクトに携わっています。このボリュームは非常に高速に処理する必要があります (加算、減算、しきい値処理など)。さらに、ほとんどのボリュームは非常に大きいため、システムのメモリに収まりません。そのため、ボリュームとイメージ データをホストし、オペレータをオーバーロードする抽象ボリューム クラス (VoxelVolume) を作成して、ボリュームに対して通常の数学演算を実行できるようにしました。これにより、さらに 2 つの質問が開かれ、stackoverflow に追加の 2 つのスレッドに入れます。

これが私の最初の質問です。私のボリュームは、float 配列データのみを含むことができるように実装されていますが、含まれているデータのほとんどは UInt16 イメージ ソースからのものです。float 配列イメージを作成できるのは、ボリュームに対する操作のみです。

このようなボリュームの実装を開始したとき、クラスは次のようになりました。

しかしその後、演算子や戻り値をオーバーロードするとさらに複雑になることに気付きました。例は次のとおりです。

また、2 つのオーバーロード演算子を追加すると、より複雑になります。

上記の問題を克服できると仮定しましょう。ただし、画像データを含むさまざまなタイプの配列があります。ボリュームのタイプを float に修正したので問題ありません。2 つのイメージ ボリューム配列の内容を追加するときに安全でない操作を行うことができます。ここでいくつかのスレッドを読み、Web を見回しましたが、異なるタイプの 2 つの配列をすばやく追加したい場合に何をすべきかについての適切な説明が見つかりませんでした。残念ながら、C# は基礎となるデータ型のサイズを計算できないため、ジェネリックに対するすべての数学演算は不可能です。もちろん、C++/CLR を使用してこの問題を回避することもできますが、現在のところ、これまでに行ったことはすべて、何もしなくても 32 ビットと 64 ビットで実行できます。C++/CLR への切り替えは、私には次のように思えました (間違っていたら訂正してください)。m は特定のプラットフォーム (32 ビット) にバインドされており、アプリケーションを別のプラットフォーム (64 ビット) で実行するには、2 つのアセンブリをコンパイルする必要があります。これは本当ですか?

簡単に尋ねたところ、2 つの異なるタイプの 2 つの配列をすばやく追加するにはどうすればよいでしょうか。C# の開発者がこれについて考えていないというのは本当ですか。別の言語 (C# -> C++) への切り替えはオプションではないようです。

この操作を行うだけで

うまくいけばいいのですが、不可能で不要です。私が試していた私の解決策は次のとおりです。

上記のコードが正しくない場合はご容赦ください。C# エディターを使用せずに記述しました。上記のような解決策は考えられますか?間違いや不完全な説明がありましたら、お気軽にお問い合わせください。

助けてくれてありがとう
マーティン