6


0

重要:この非常に関連した質問を参照してください。

私はどうやってANSI Cで同じことをするのですか? あなたは構造体を使うか、関数内のパラメータのアドレスを渡すか? 読みやすさを犠牲にしても、私は非常に効率的な(速い)コード(時間とスペース)を追っています。

編集:すべての答えをありがとう。 わかりました、私はいくつかの説明があると思います:私は特定のドメインのためのアルゴリズムの特定のサブセットについてこの本を書いています。 私は、読みやすさと他のものを犠牲にして、私のすべてのアルゴがウェブに掲載するために最も効率的な(時間と空間の)実装をするというまったく恣意的な目標を設定しました。 それは部分的に私の(一般的な)質問の本質です。

答え:(おそらく)最も速いものからもっと一般的なもの(これは先験的なことすべて、つまり テストせずに):

  1. グローバルオブジェクトにoutvaluesを格納します(outvals [2]のようなものを想定しますか?)、または

  2. 関数(foo(int in、int * out1、int * out2))に値をparamsとして渡します。

  3. 両方の値を持つ構造体を返す

  4. (3)値が意味的に関連している場合のみ。

これは意味がありますか? もしそうなら、私はジェイソンの回答が最も近いと思います。 Robert’sは大丈夫ですが、現時点では意味論は私の考えているものではありません(ただし彼のアドバイスは正式に記されています)。

皆さん、ありがとうございました。

11 回答


7


どちらの方法も確実に有効ですが、どちらを選択するのが最善なのかを判断するには、セマンティクス(struct vs parameter reference)を考慮します。

あなたが返す値が密接に結合されているのであれば、それらを構造体として返しても大丈夫です。 しかし、単に値を(構造体として)一緒に返すための*人工的なメカニズム*を作成している場合は、パラメータ参照(つまり、 値を呼び出し元の関数に返すには、変数のアドレスを渡します。


5


ニールが言うように、あなたはあなた自身でそれを判断する必要があります。

何でも渡すコストを避けるために、グローバルを使用してください。 次に最適なのは、ポインター/参照によって渡される単一構造です。 その後は個々のポインタ/参照パラメータです。

ただし、呼び出し後にデータを構造体にパックしてから読み戻す必要がある場合は、個々のパラメータを渡す方が得策です。

よくわからない場合は、両方の方法を使って簡単なテストコードを少し書いて、それぞれ数十万回実行して、どれが最適かを確認してください。


3


あなたは2つの可能な解決策とあなたの知覚されたパフォーマンスの制約について説明しました。 あなたがここから行くところはあなた次第です - 私たちは十分な情報を得た上で判断を下すのに十分ではありません。


3


最も読みやすいのは関数の中でアドレスを渡すべきであり、そしてそれはまた速くなければならない、ポップとプッシュは安いです:

void somefunction(int inval1、int inval2、int * outval1、int * outval2){int x = inval1; int y = inval2;
// do some processing
* outval1 = x。 * outval2 = y。戻る}


1


最速のQ


1


構造体ポインタを返すとき、おそらくそのためのメモリを手動で見つける必要があると思います。 パラメータリスト内のアドレスはスタックに割り当てられます。これははるかに高速です。


1


参照よりも値でパラメータを渡して戻り時に更新する(またはスタックにローカルコピーを作成する)方が速いことがあることに注意してください。 これは、構造が小さい、パラメータが少ない、アクセス数が多いことから非常に明白です。


0


住所を構造体に渡します。 返される情報が複雑でなければ、アドレスに値を渡すだけでもうまくいきます。

個人的には、それは本当にインターフェースがいかに面倒になるかにかかっています。

void SomeFunction(ReturnStruct * myReturnVals){//値を入力してください}

// Do some stuff
ReturnStruct returnVals; SomeFunction(
// Do more stuff


0


これはあなたのアーキテクチャーに大きく依存しますし、関数がインライン化されることを期待している(あるいは持つことができる)場合も同様です。 私は最初に最も簡単な方法でコードを書き、次にそれがあなたのコードの高価な部分として現れるのであれば速度について心配します。


0


どちらの場合も、参照を渡しているので、パフォーマンスはほぼ同じになります。 関数が実際に値を返さない可能性がある場合は、単にnullを返すので、 "return a struct"オプションを使用してmallocのコストを回避できます。

私の個人的な好みは、動的に割り当てられた(mallocされた)構造体を返すことです。 関数の引数を出力に使用することは避けます。長期的に見てコードが混乱しやすくなり、保守が困難になるからです。