0

関数では、戻り値と out 引数のどちらを使用するのが最適ですか? ある方法が他の方法よりも望ましいですか?Cで。

vec_t は構造体 (typedef) です。

typedef struct {
    float   x, y, z;
} vec_t;

.

void multiply_vectors(vec_t* v1, vec_t* v2, vec_t* out) {
    ...
}

vec_t result;
multiply_vectors(&first, &second, &result);

また

vec_t multiply_vectors(vec_t* v1, vec_t* v2) {
    vec_t v;
    ...
    return v;
}

vec_t result = multiply_vectors(&first, &second);
4

2 に答える 2

3

それは主に個人的な好みに依存します。私は通常、実際の戻り値を使用します。戻り値を乗算する必要がある場合は、out 引数を使用するか、それが理にかなっている場合は、すべての戻り値を含む構造体を作成して、正常に返すことができます。

特にポインターに関与するため、引数が混乱を招くことがわかりました。

于 2013-04-03T11:47:42.643 に答える
0

正解は一つではありません。最初に考慮すべきことは、その特定の操作にとって意味のあることです。あなたの例では、新しいベクトルを出力パラメーターではなく戻り値として返すことは理にかなっています。これは数学演算であるためです。ただし、 のようなライブラリ関数を見るとscanf、値に出力パラメータを使用し、「ステータス」値を返します。繰り返しますが、scanf通常の使用方法については、これは理にかなっています。

ただし、他にも考慮事項がある場合があります。関数の本体に「一時的な」ベクトルを作成していることに注意してください。これはスタック上のスペースを占有します。関数が戻ったときに、そのベクトルの内容をターゲットにコピーする必要があります。この場合、心配する必要はありませんが、非常に大きなアイテムを扱っている場合は、パフォーマンスに悪影響を及ぼす可能性があります。そのような場合は、出力パラメーターを使用して、ポインターをターゲットに渡す方がよい場合があります。

C++ では、コンストラクターとデストラクタを扱っている場合、問題は少し悪化し、単純な return がフードの下で多くのコードを実行することになります。繰り返しますが、理にかなった方法から始めますが、パフォーマンスの問題が発生した場合は、別の方法を使用する必要がある場合があります。

于 2013-04-03T13:03:08.987 に答える