1

次のような、1 秒間に 10 回呼び出される関数があるとします。

void RxData(System::Byte *Data){}

この関数では、構造体に *Data を入力します。構造体は次のようになります。

Struct datastr{
float first;
float second;
}

パフォーマンスとメモリ使用の観点からは、extern 変数を宣言してから次のことを行う方が適切ですdatastr str1

void RxData(System::Byte *Data){str1=*reinterpret_cast<datastr*>(Data);}

または、次のように構造体を毎回再初期化します。

void RxData(System::Byte *Data){datastr str1; str1=*reinterpret_cast<datastr*>(Data);}

誰かがメモリ管理の違いを説明できますか? 私は 2 番目のオプションの方が「クリーン」であると考える傾向がありますが、その理由について議論することはできません。

4

2 に答える 2

1

バージョン 2 に固執してください。ローカリティが向上し、読みやすさが向上し、エラーが発生しにくくなります。RxData が 1 秒あたり 10 回呼び出される場合、datastr の初期化を最適化することは考えません。ただし、本当に気にする場合は、datastr のコピー ctor を使用して、コードを次のように変更できます。

datastr str1(*reinterpret_cast<datastr*>(Data));

ところで、構文は C++ よりも C# に似ています。

于 2013-05-14T08:41:55.680 に答える
1

メモリ管理に関しては、データは明らかにメモリ内のさまざまな場所に配置されます。グローバル変数は静的セグメントに配置され、ローカル変数はスタック上にあります。毎回作成されますか?はい。パフォーマンスに影響しますか? 場合によります。datastr本当にあなたがここに示しているように見えるなら、いいえ。

関数の実行時にキャッシュに存在する可能性が非常に高いため、パフォーマンスがわずかに向上する可能性があります。グローバル変数もそこにあるかもしれませんが、おそらくそうなるでしょうが、それは別のメモリ位置にあるため、プリフェッチャーがより多くの作業を行う必要があることを意味する可能性があります。

オプション 2 は、スタイルの点で明らかに優れています。リーダーは関数を見ながらすべてを手元に持っているので、データ フローを解読するために飛び回る必要はありません。

于 2013-05-14T08:54:51.100 に答える