0

重複の可能性:
C++ で「オブジェクトを返す」方法

関数 func_foo が与えられたデータセットに対して何らかの計算を行うことができ、いくつかの数値を処理した後、呼び出し元に返す必要がある結果が得られるとします。ポインターを結果変数に渡し、値を返す関数と比較して関数で変更されることに(パフォーマンスに関して)報酬はありますか-Char *および構造体型の結果の利便性/実用性以外。

質問を投稿する前に、このクエリの予備検索を行いましたが、関連するものは見つかりませんでした。関連する議論が存在する場合は、それを教えてください。

4

1 に答える 1

1

一般的なアドバイスと同様に、最も読みやすい方法でコーディングしてください。プロファイリングでボトルネックであることが示された場合にのみ、その方法から変更してください。

コピーが必要になる可能性のある大きな構造体を返すつもりでない限り、違いはごくわずかです。大きな構造体の場合でも、コンパイラが巧妙であれば、生成されたコードを見ると、2 つが本質的に同等であることがわかります。

ほとんどのコンパイラはレジスタを使用してレジスタに収まる値を返しますが、これは非常に高速です。したがって、そのような値の場合、ポインターを使用して値を返すことが利点であるとは想像できません。

最後に、エラー コードを関数値として返すのは一般的な C 規則です。したがって、この場合、メモリへのポインターを使用して値を返すことも一般的です。この規則を使用する API は統一されている傾向があり、その結果、使いやすくなっています。

非常に簡単な例:

struct list_s {
   int size;
   struct element_s *array;
}

int initialize_list(struct list_s *list, int size)
{
   int err_code = 0;

   // do the intialization of *list, setting err_code if something goes wrong
   list->array = malloc(size * sizeof(struct element_s));
   if (list->array)
     list->size = size;
   else {
     size = 0;
     err_code = ERR_OUT_OF_MEMORY;
   }

   return err_code;
}
于 2012-11-20T01:12:47.950 に答える