メンバー変数のないファンクターがあります。このファンクターを必要に応じてその場で作成するか、メンバー変数としてキャッシュする方が効率的かどうか疑問に思っています。よくわからない空の基本クラスの最適化とキャッシュの局所性に関して問題があります。
struct Foo
{
int operator()(const MyData& data) const { ... }
};
メンバー変数のないファンクターがあります。このファンクターを必要に応じてその場で作成するか、メンバー変数としてキャッシュする方が効率的かどうか疑問に思っています。よくわからない空の基本クラスの最適化とキャッシュの局所性に関して問題があります。
struct Foo
{
int operator()(const MyData& data) const { ... }
};
空のオブジェクトの場合は、スタックに作成するだけです。ファンクターをメンバーとしてタイプに追加すると、すべてのオブジェクトが大きくなります。それをベースとして追加すると(空のベースの最適化を利用するために)、型operator()(const MyData&)
が理由もなく実装される奇妙な設計が生成されます。非公開にしてもオペレーターが付きます。
この型にはメンバーがないため、アクセスするデータがないため、キャッシュの局所性の問題はありません。ステートレス ファンクターの主な用途は、コンパイラが関数の呼び出しをインライン化できるようにすることです (同じ名前のフリー関数と比較して)。
最適化の一般的なルールは、コードが最初に機能するようにし、必要であることが証明された場合にのみ最適化することです (つまり、コードのプロファイルを作成し、パフォーマンスを大幅に改善するために対処する必要があるボトルネックを見つけた場合)。