0

私は現在、C++ で書かれた C 用の単純なクローン検出器を開発しており、効率と C++ コードを最適化する方法について無限の質問を自問自答しています。

私が持っている 1 つの質問は、構造体を効率的に渡す方法に関するものです。以下のような構造体が与えられた場合:

typedef struct {
    unsigned int a;
    void *b;
} my_struct;

my_struct パラメーターに対して多数の操作 (割り当てではない) を実行する関数。この関数は、AST トラバーサルの各ノードに対して呼び出されます (非常に多く...)。いくつかの予備的な読み取りに基づいて、私が理解していることは、構造体 (非ポインター) のインスタンスを渡すと、そのコピーが呼び出された関数に対して作成されます。

したがって、構造体をポインターとして渡してから逆参照する方が効率的ですか?

void foo(my_struct *s) {
    // then dereference s->a...

基本的に:コピーの速度と逆参照の速度が私の質問です。

メモリ消費のために、構造体をポインタとして渡す方が賢明だと思いますが、速度に関する副作用についてはわかりません。

4

2 に答える 2

1

場合によります。

あなたの場合、構造体はポインタよりも大きくありません。構造体全体を関数の引数として渡すことは、ポインターを渡すことよりもそれほど遅くない可能性があります。

関数内では、ポインターを介して構造体のメンバーにアクセスすると、ローカルの構造体オブジェクトのメンバーにアクセスするよりも遅くなる場合がありますその場合、構造体を直接渡すと、関数内で多くのことを行っている場合に全体的に高速なコードが得られる可能性があります。ただし、それは CPU の機能と生成されたコードに依存します。ポインターを介しているかどうかに関係なく、メンバーアクセスの速度は同じである可能性があります。

この質問に答える唯一の方法は、独自のコードのパフォーマンスを測定することです。得られた回答は、現在の状況にのみ適用され、他のターゲット システムや別のバージョンのコンパイラで変更される可能性があります。

コードを最適化するようにコンパイラに指示していることを確認してください。そうしないと、パフォーマンスを測定する意味がありません。

于 2013-03-26T21:29:06.813 に答える
0

スタックがキャッシュからページアウトされる可能性が低いため、スタックからの読み取り (コピー) はより確実に高速になりますが、コピーを実行するコストも発生し、スタックがさらにいっぱいになる可能性があります。

私の経験則は、「単純な」データを値で渡し、「複雑な」データを参照で渡すことです。通常、データが 8 ~ 16 バイトを超える場合は、参照を渡す価値があるかどうかを検討し始めます。

ここで考慮すべきもう 1 つのことは、最適化する価値があるかどうかです。パターンを壊すとコードのサポートが難しくなるため、問題がある、または問題が発生する可能性があることを証明できない限り、(コードの残りの部分とは異なる) 予期しない方法で物事を行うことは避けようとします。

于 2013-03-26T21:30:18.993 に答える