配列がすべて 0 (または false) の場合、すべての単一の値を反復/ループせずに、同じサイズの新しい配列を割り当てずに (を使用してmemcmp
) C(++) でチェックできますか?
ブール値の配列を悪用して、実行時に任意の大きなビットセットを持ち、ビットフリップを実行しています
次の条件を使用できます。
(myvector.end() == std::find(myvector.begin(), myvector.end(), true))
明らかに、内部的に、これはすべての値をループします。
true
別の方法 (実際にはループを回避する必要があります) は、すべての書き込みアクセス関数をオーバーライドし、ベクターに書き込まれたことがあるかどうかを追跡することです。
アップデート
以下の Lie Ryan のコメントは、同じ原則に基づいて、これを行うためのより堅牢な方法を説明しています。
ソートされていない場合は、いいえ。それをどのように達成する予定ですか?すべての要素を検査して、0 かどうかを確認する必要があります。もちろん、memcmp もすべての要素をチェックします。別の配列も読み取るため、はるかに高価になります。
もちろん、0 以外の要素にヒットするとすぐにアーリーアウトできます。
唯一のオプションは SIMD を使用することです (技術的にはすべての要素をチェックしますが、使用する命令は少なくなります) が、通常はジェネリック配列では使用しません。
(ところで、私の答えは、単純な静的 C/C++ 配列があることを前提としています。配列の種類を指定できる場合は、より具体的にすることができます。)
boost::dynamic_bitset
代わりに使用することを検討してください。これにはnone
メンバーとその他のいくつかのstd::bitset
操作がありますが、その長さは実行時に設定できます。
N 要素の配列があると仮定すると、一連の基本ベクトルに対してビット チェックを実行できます。
たとえば、テストする 15 要素の配列があるとします。
8 要素のゼロ配列、4 要素のゼロ配列、2 要素のゼロ配列、および 1 要素のゼロ配列に対してテストできます。
テストする配列の最大サイズがわかっている場合は、これらの要素を一度だけ割り当てる必要があります。さらに、テストは並行して実行できます (必要に応じてアセンブリ組み込みを使用して)。
4 要素のゼロ配列は 8 要素のゼロ配列の前半にすぎないため、8 要素の配列のみを使用することで、メモリ割り当てに関してさらに改善することができます。
これが要件になることがわかっている場合は、配列 (おそらく動的) とカウントまたは現在ゼロ以外のセルで構成されるデータ構造を構築できます。明らかに、セルの設定は抽象化する必要がありますが、オーバーロードを使用する c++ では当然のことであり、c では不透明型を使用できます。
ニット、
ターゲットコンピューター上のいくつかの派手なDMAハードウェアにアクセスできるとは思いませんか?DMAハードウェアは、必要な操作を正確にサポートする場合があります。つまり、「メモリのこの領域はすべてゼロですか?」この種のハードウェアアクセラレーションによる比較は、大きなビットバッファを処理する場合の一般的なソリューションです。たとえば、一部のRAIDコントローラは、パリティチェックにこのメカニズムを使用します。
いいえ、配列を と比較することはできmemcmp
ますが、1 つの値をメモリ ブロックと比較することはできません。
できることは、C++ でアルゴリズムを使用することですが、それでも内部的にループが含まれます。
全体を反復処理する必要はありません。ゼロ以外の最初の値でループを停止するだけです。
一連の値を順番に検査する以外に、一連の値をチェックする方法は考えられません。基礎となるメモリをbool
(__int64
たとえば)より大きいものとしてチェックしてゲームをプレイできますが、アライメントが問題になります。
編集:設定されたビットの個別のカウントを保持し、それがゼロ以外であることを確認できます。これのメンテナンスには注意が必要です。そのため、セット ビットを設定することはできませんでし++
た。