問題タブ [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#コードでポインターを使用する必要はほとんどありません。私の質問は、コードのブロックで「安全でない」と明示的に述べなければならない理由は何ですか。さらに、「安全でない」コードを許可するためにコンパイラオプションを変更する必要があるのはなぜですか?
結論: CLR(または言語仕様)の何が原因で、「unsafe」と入力してコンパイラオプションを変更せずに、いつでも(CやC ++のように)ポインタを使用できないようになっていますか?
明確にするために:私は「安全でない」および「安全な」コードが何であるかを知っています。これらの機能を使用できるようにするためだけに、なぜすべての余分な作業を実行する必要があるのか(それほど余分な作業ではありません)の問題です。
c# - float[] を byte[] に変換する最速の方法は何ですか?
配列全体を(おそらくキャストを介して)ループせずに、できるだけ早くabyte[]
から aを取得したいと思います。float[]
安全でないコードは問題ありません。ありがとう!
float 配列よりも 4 倍長いバイト配列を探しています (各 float は 4 バイトで構成されているため、バイト配列の次元は float 配列の 4 倍になります)。これを BinaryWriter に渡します。
編集:「時期尚早の最適化」を叫んでいる批評家へ:最適化する前に、ANTSプロファイラーを使用してこれをベンチマークしました。ファイルにはライトスルー キャッシュがあり、float 配列はディスク上のセクター サイズと正確に一致するサイズになっているため、速度が大幅に向上しました。pinvoke
バイナリ ライターは、 'd win32 APIで作成されたファイル ハンドルをラップします。これにより関数呼び出しの数が減るため、最適化が行われます。
また、メモリに関しては、このアプリケーションは大量のメモリを使用する大規模なキャッシュを作成します。バイト バッファーを 1 回割り当てると、何度も再利用できます。この特定のインスタンスでの 2 倍のメモリ使用量は、アプリの全体的なメモリ消費量の丸め誤差になります。
したがって、ここでの教訓は、時期尚早の仮定をしないことだと思います ;)
c# - C#の安全でない値型の配列からバイト配列への変換
拡張メソッドを使用して、float配列をバイト配列に変換します。
配列は、要素のタイプと数に関する情報に関連付けられたメモリへのポインタであることを理解しています。また、上記のようにデータをコピーせずにバイト配列との間で変換を行う方法はないように思われます。
私はこれを理解しましたか?データをコピーせずに、ポインタ、型、長さから配列を作成するためにILを作成することさえ不可能でしょうか?
編集:答えてくれてありがとう、私はいくつかの基本を学び、新しいトリックを試してみることができました!
Davy Landmanの答えを最初に受け入れた後、彼の素晴らしいStructLayoutハックはバイト配列をfloat配列に変換しますが、その逆は機能しないことがわかりました。実証するために:
CLRは、両方の配列が同じ長さであると見なしているようです。構造体がfloatデータから作成されている場合、バイト配列の長さが短すぎます。
c# - LockBits パフォーマンス クリティカル コード
私は可能な限り高速にする必要があるメソッドを持っています。それは安全でないメモリポインタを使用し、このタイプのコーディングへの私の最初の進出なので、おそらく高速になる可能性があることを知っています.
それで、これをより速くするためにできることはありますか?今のところ todo は無視してください。ベースラインのパフォーマンス測定値が得られたら、後で問題を修正してください。
更新:申し訳ありませんが、Graphics.DrawImage の代わりにこれを使用している理由は、マルチスレッドを実装しているためであり、そのため DrawImage を使用できないためです。
更新 2:私はまだパフォーマンスに満足しておらず、さらに数ミリ秒かかる可能性があると確信しています。
c# - このコードが安全でないキーワードなしで機能するのはなぜですか?
彼自身の物議を醸す質問への回答で、マッシュは、.NETオブジェクトインスタンスのバイトを直接読み書きするために「unsafe」キーワードは必要ないことを示しました。次のタイプを宣言できます。
そして、「不変」の文字列を変更するなどのことができます。次のコードは、私のマシンに「バー」を出力します。
同じ手法でオブジェクト参照を破損することにより、 AccessViolationExceptionをトリガーすることもできます。
質問:(純粋に管理されたC#コードでは)このようなことを行うには、安全でないキーワードが必要だと思いました。なぜここで必要ないのですか?これは、純粋に管理された「安全な」コードが実際にはまったく安全ではないことを意味しますか?
sql-server - SQL Server 2005:@@ IDを使用しても安全ですか?
従業員テーブルにレコードを挿入する手順があります。@@identityを使用してempidを取得しますか?このプロシージャが複数のユーザーによって同時に呼び出される場合、同時に挿入された他の従業員のIDが返される可能性があります。システムによるIDのロックがないためですか?
--code --identity on for empid column
insert into employee(name)values('sahil'); @@identityを返す
SQL Server 2005を参照してください:@@ IDを使用しても安全ですか? IDのロックの問題
c# - パブリック変数の受け渡しアドレス
次のようなパブリック変数のアドレスを渡そうとすると、次のようになります。
このエラーが発生します:
Register関数は次のようになります。
ビーコンはリストです。パブリック半径のクラスを開催しています。
.net - unsafe タグでコンパイルされた .NET コードは Mono で実行できますか?
LockBits メソッドを使用してビットマップ操作を行い、ポインターを使用して直接ビットマップ データにアクセスするコードがあります。もちろん、このコードは unsafe ブロックでラップする必要があり、これはコードが Mono で機能しないことを意味するのではないかと考えていました。
私は Bitmap クラスが Mono で利用可能であると仮定していますが、それは別の契約破りかもしれません.