web-dev-qa-db-ja.com

構造体の割り当てまたはmemcpy?

構造を別の構造(Cで)に複製したい場合、賛否両論は何ですか:

struct1 = struct2;

memcpy(&struct1, &struct2, sizeof(mystruct_t));

それらは同等ですか?パフォーマンスやメモリ使用量に違いはありますか?

36
ofaurax

struct1=struct2;表記はより簡潔であるだけでなく、より短く、コンパイラに最適化の機会を与えます。 =のセマンティックな意味は割り当てですが、memcpyはメモリをコピーするだけです。読みやすさにも大きな違いがありますが、この場合memcpyは同じことをします。

=を使用します。

34

同じトピックに関するこの会話をご覧ください: http://bytes.com/topic/c/answers/670947-struct-assignment

基本的に、構造体のコピーが何をするかについて、そのスレッドのコーナーケースについて多くの意見の相違があります。構造体のすべてのメンバーが単純な値(int、doubleなど)であるかどうかは明らかです。混乱は、配列とポインター、およびパディングバイトで何が起こるかによって生じます。

それはすべてのバイトの逐語的なコピーであるため、memcpyで何が起こるかに関してすべてがかなり明確になっているはずです。これには、絶対メモリポインター、相対オフセットなどが含まれます。

4
Berin Loritsch

ほとんどのコンパイラーは内部でmemcpyを使用すると思いますが、パフォーマンスの違いはわかりません。

私はほとんどの場合、割り当てを好むでしょう、それは読みやすく、目的が何であるかについてはるかに明確です。いずれかの構造体のタイプを変更すると、コンパイラーはコンパイラーエラーを与えるか、operator =(存在する場合)を使用して、必要な変更をガイドします。一方、2番目のものは、わずかなバグを引き起こす可能性のあるコピーを盲目的に行います。

2
Andy Lowry

一方が他方よりもパフォーマンスが優れているという固有の理由はありません。コンパイラーとそのバージョンが異なる場合があるため、本当に気にするのであれば、プロファイルの作成とベンチマークを行い、事実を判断の基礎として使用します。

まっすぐな割り当ては読みやすくなります。

代入は、間違えるのが少し危険です。そのため、ポインタが指す構造体ではなく構造体に割り当てます。これを恐れるなら、あなたのユニットテストがこれをカバーしていることを確認するでしょう。このリスクは気にしません。 (同様に、memcpyは、構造体のサイズを間違える可能性があるため危険です。)

2
user25148