0

関数の最後に N カウントのバイトを追加することは可能ですか?

私の簡単なアイデアは、次のコードを追加することです。

_asm {
    NOP
    NOP
    NOP
    NOP
    NOP
}

それを行う他の方法はありますか? (コード、コンパイラ、またはその他の方法で)

関数のホットパッチに必要です。いくつかの IF ステートメントを含む関数があります。関数は 1 秒間に 10 回以上呼び出されます。したがって、パフォーマンスを向上させるには、「そのコードを実行する必要があるか?」などのチェックを減らす必要があります。IF ステートメントのブール値はそれほど頻繁には変更されません (めったにないと思います)。また、コードを実行する必要がない場合は、それを確認する必要がないことも達成したいと考えています。

4

4 に答える 4

1

一般に、はい。ただし、そのためには関数をアセンブリで記述する必要があります。

一方、あなたがやっていることは、コードをベンチマークするのではなく、コードをマイクロ最適化しているようです。C++ の BOOL と条件文は非常に高速であり、最新のシステムでオペコードにパッチを適用するコストは、非常に驚​​くほど悪いパフォーマンス ペナルティを引き起こす可能性があります (たとえば、コードを書き込み可能にするための VirtualProtect の呼び出しは、組み込みシステムで実行している場合でも、関数をインラインで変更することにより、パイプラインのストールとキャッシュ ミスを強制します)。

要約すると、はい、あなたがしていることは可能です。ただし、これを「興味のない」演習として実行したり、条件のパフォーマンスが非常に重要であるにもかかわらず C で記述している非常に奇妙な環境で実行したりしない限り、代わりにコードをベンチマークして実際の場所を見つけたいと思うでしょう。実際にはパフォーマンスが重要ではないものにパッチを当てるために膨大な労力と労力を費やすのではなく、遅いところです。

于 2013-03-06T21:23:33.733 に答える
1

MSVC にはコンパイラ オプション/hotpatchがあり、有効な関数に対してホットパッチが機能するように最終バイナリの処理を変更するリンカー オプション/functionpadminを許可します。ホットパッチを許可する予約バイト数を指定できます。詳細はリンク先をご覧ください。

于 2013-03-06T21:19:10.977 に答える
1

1 つのポイントを返す関数を記述し、return ステートメントの前に NOP を追加することができます。これはプラットフォームに依存しますが。

もう 1 つの方法は、return ステートメントの前にガベージ コードを配置し、ラベルとgoto.

未使用のコードを削除する可能性があるコンパイラとリンカーの最適化に注意してください。

于 2013-03-06T22:05:34.733 に答える
0

関数は1秒間に10回以上呼び出されます。だから、パフォーマンスを向上させるために

関数の完了に50〜100ミリ秒かかりますか?つまり、ここには本当にパフォーマンスの問題がありますか?1秒間に10回は、単純で通常の関数には何の意味もありませんが、計算量の多い関数には多くの場合があります。

ある程度のスペースを確保するために、コンパイラにそれを強制する普遍的な方法はありません。特定のコンパイラーのための特別な方法を見つけることができるかもしれませんが、より良いアプローチは、同じコードの複数のバージョンを用意するか、実行時にその場でコードを作成することです。

于 2013-03-06T21:24:11.560 に答える