2009-07-06 7 views
6

重要:この非常に関連する質問はReturn multiple values in C++をご覧ください。C関数から複数の値を返す

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

EDIT:ありがとうございました。わかりました、私はいくつかの説明を借りていると思います:私は特定のドメインのアルゴリズムの特定のサブセットについてこの本を書いています。私はすべての私の藻類が読みやすさなどの費用をかけてウェブ上に置くための最も効率的な(時間と空間の)実装を作るという全く任意の目標を設定しました。それは部分的に私の(一般的な)質問の性質です。

回答:私は、私は(テストなしすなわち、このアプリオリの全て)より、一般的な無意味に最速(多分)から、このストレートを取得願っています:グローバルオブジェクトで

  1. ストアoutvalueパラメータを(I (foo(int in、int * out1、int * out2))または
  2. アウトバウンドを両方のアウトバウンドで返すか、または
  3. (3)値が意味的に関連している場合のみ。

これは意味がありますか?もしそうなら、私はジェイソンの答えが "パズル"の一部を提供しているにもかかわらず、最も近いと思います。ロバートは大丈夫ですが、現時点ではセマンティクスは私の後ではありません(彼の助言は正式には記載されていますが)。

ありがとうございます。

+3

あなたのコードとプロフィールを無慈悲に書いてください。 struct-vs-referenceのパフォーマンスへの影響は他の実装と比べて非常に小さいので、考慮する価値はないことがわかります。 –

+0

これは良いアドバイスです。ありがとう。 (さようなら、私はあなたにアップアップをしました、それは私がはるかに現実的な答えの後であったということです。) –

+0

私は知っています。ありがとうございました。 –

答えて

5

、お楽しみください。

何かを渡すコストを避けるには、グローバルを使用します。次善は、ポインタ/参照によって渡される単一の構造体です。その後は、個々のポインタ/参照パラメータです。

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

あなたが不明な場合は、両方のアプローチを使用して少しずつテストコードを書いて、それぞれ数十万回実行して、どれが最適かを見てみましょう。

3

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

+0

私は理解します。ちょうどCを開始し、より良い方法があるかどうかを知りたがっています。あなたは構造体が代替品より高価だと言うでしょうか? –

+1

編集者には、訂正の際にあなた自身のスペルを必ず確認してください。 –

+0

@Dervinおそらく2つのオプションの間にパフォーマンスに大きな違いはありませんが、これは構造体の使い方に依存します。パフォーマンスがそれほど重要である(と率直に言って、それはまれである)場合、最も速いものを見つけるためにあなた自身の測定を実行する必要があります。 –

1

最も速いQ &私が考えることができるD方法は、グローバルオブジェクトに値を渡すことです。この方法では、スタック操作をスキップするだけで、スレッドセーフではないことに留意してください。

+1

必ずしも、グローバルオブジェクトをキャッシュに取り込む必要があるとは限りません。 –

0

私は構造体にアドレスを渡します。返される情報が複雑でない場合は、アドレスに値を渡すだけでも機能します。

個人的には、インターフェイスがいかに乱雑であるかが実際に分かります。

void SomeFunction(ReturnStruct* myReturnVals) 
{ 
    // Fill in the values 
} 

// Do some stuff  
ReturnStruct returnVals; 
SomeFunction(&returnVals);  
// Do more stuff 
+0

私の無知を許して、私はまだCをあまり知らない。構造体のローカルコピーを返すのはなぜですか? –

+0

関数内で割り当てられたメモリを指していなければ、それは悪いことではありません。私はちょうど混乱を減らすためにそのブロックを削除するつもりです。 –

+0

@Soo Wei Tan - いいえ、あなたは関数内で割り当てられたメモリについて正しくありました(そしてこれは悪い) - それを削除する必要はありませんでした。 – KevinDTimm

7

どちらの方法がcertianly、有効ですが、私は最高はあなたのプログラマに意図を通信する方法を決定するセマンティクス(パラメータ参照対構造体を)検討するでしょう。

を返す値が密接に結合されている場合は、構造体として返すことができます。しかし、人工機構を一緒に(構造体として)返す場合は、パラメータ参照を使用して(つまり、変数のアドレスを渡して)呼び出し元関数に値を戻す必要があります。

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

ロバートC. Cartaino

3

読むための最も簡単な関数のアドレスを渡す必要があり、それはまた、高速である必要があり、ポップとプッシュが安い:

void somefunction (int inval1, int inval2, int *outval1, int *outval2) { 
    int x = inval1; 
    int y = inval2; 
// do some processing 
    *outval1 = x; 
    *outval2 = y; 
    return; 
} 
+0

&outval1、int&outval2を意味しますか? –

+3

番号。私は何を意味するか正確に書きました。 – KevinDTimm

+0

大丈夫ですが、コードを強調表示してください – mtasic85

0

これは、あなたのアーキテクチャに大規模に依存し、また、あなたが予想される場合(またはできhave)関数がインライン化されています。私はまずコードを最も簡単な方法で書いておき、それがあなたのコードの高価な部分として現れたらスピードを心配します。

1

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

0

どちらの場合でも、参照を渡すので、パフォーマンスは似ているはずです。関数が実際に値を返すことがない可能性がある場合は、nullを返すだけなので、「構造体を返す」オプションを使用したmallocのコストを避けることができます。

私の個人的な好みは、動的に割り当てられた(mallocされた)構造体を返すことです。私は、コードをより混乱させず、長期的には維持しにくいと思うので、出力のために関数の引数を使うのは避けてください。

+0

動的に割り当てられると、メモリリークの可能性は最低限になります。これは、関数のユーザーがはるかに注意する必要があることを意味します。 –

1

パラメータを値で渡し、リターン時に更新する(またはスタック上にローカルコピーを作成する)のがリファレンスよりも速い場合があることに注意してください...これは、小さな構造やパラメータやアクセスが多い場合にはっきりします。

-1

構造体のローカルコピーを返すのは、構造体が関数内で非静的であると宣言された場合、関数を終了するとnullとvoidになるためです。

すべての人に参考にしてもらいましたが、OPは "C"と言っていましたが、Cには参照がありません。

甘い羽のイエス・キリスト、私は明日目を覚ますことができ、テレビでフロップの王について何も見る必要はありませんか?

関連する問題