25

最近、誰かがsizeof(type)の代わりにsizeofvarを使用したことで別のユーザーを称賛しているのを見ました。私はいつもそれがただのスタイルの選択だと思っていました。大きな違いはありますか?例として、fとffの線は、gとggの線よりも優れていると見なされました。

 typedef struct _foo {} foo;

 foo *f = malloc(count * sizeof f);
 foo *g = malloc(sizeof(foo) * count);

 foo **ff = malloc(count * sizeof *ff);
 foo **gg = malloc(sizeof(foo*) * count);

私の意見では、最初のセットはスタイルの問題です。しかし、2番目の行のペアでは、余分な2番目の*は乗算と簡単に混同される可能性があります。

4

7 に答える 7

51

変数の型が変更された場合、変数が型ではなく引数である場合、sizeofを変更する必要はありません。

@icepackのコメントに関して:タイプと変数名の変更の可能性または可能性は問題ではありません。変数名がsizeofの引数として使用され、後で変更されたと想像してください。最良の場合、リファクタリング-名前変更操作はすべてのオカレンスを変更し、エラーは発生しません。最悪の場合、sizeofのインスタンスが失われ、コンパイラーが文句を言って修正します。タイプが変更された場合は、sizeofステートメントでエラーが発生する可能性はありません。

ここで、型がsizeofの引数であると想像してください。変数のタイプが変更された場合、その変数に関連するすべてのsizeofを見つけるための検査以外の手段はありません。検索することはできますが、同じタイプのsizeofの無関係な使用法すべてにヒットします。1つを見逃すと、サイズの不一致が原因で実行時の問題が発生します。これは、見つけるのがはるかに困難です。

于 2008-12-17T00:17:13.787 に答える
7

Steve の発言に加えて、sizeof はそのオペランドを評価しないことを付け加えておきます。そのため、その中で何をするのも自由です。まだ初期化されていない変数を使用できるだけでなく、ヌルポインターを逆参照したり、定義されていないが宣言されている関数を呼び出したり、他の種類のことを実行したりできます。スティーブが詳しく説明した理由により、常に式バージョンを使用することをお勧めします。

また、型名が非常に長くて判読できない場合があることも考慮してください。関数へのポインターを考えてみてください (特に C++ の場合)。書く代わりに、sizeof(my_long_type<weird, stuff>)ただやるだけですsizeof t

于 2008-12-17T00:59:25.293 に答える
4

これらの間にはほとんど違いが見られない場合があります。

foo **ff = malloc(count * sizeof *ff);
foo **gg = malloc(sizeof(foo*) * count);

..しかし、割り当てが宣言の近くにない場合はどうなりますか? 次のような行に出くわした場合:

ff = realloc(ff, count * sizeof *ff);

のタイプを覚えていなくても、行が正しいとかなり確信していますff。ただし、これが表示された場合:

ff = realloc(ff, count * sizeof(foo *));

それから私はやや疑わしいかもしれません、そしてff私の心を休ませるためにタイプを調べる必要があります.

于 2009-12-22T05:21:56.133 に答える
3

行fとffは、gとggよりも明らかに悪いです。sizeof ffはポイントであるため、はポインタサイズです。それらを同等にするには、書く必要がありますsizeof *f(または、読みやすくするためにsizeof(*f))。

于 2008-12-17T00:25:45.097 に答える
2

sizeof(type)私はメモリ割り当てで使用する傾向がありますがsizeof(variable)、ローカル変数またはグローバル変数を使用する場合は常に使用します。それにもかかわらず、常に変数名を使用するというアドバイスには知恵があります。

sizeof(variable)私はまた、使用してもよいかどうか、または使用する必要があるかどうかについて、長い議論をしました(むしろアニメーション化され、それは数日間続きました-私たちはこの問題について異なることに同意しました)sizeof variable。つまり、かっこで引数を囲むかどうかは重要ですかsizeof。について悩むコンパイラに出会ったことがないsizeof(variable)ので、均一性を選択し、常に括弧を使用しますsizeof。私の同僚も同様に、括弧を変数と一緒に使用してはならないことを断固として主張しました。どういうわけか、括弧のある表記とない表記の間に貴重な違いがありました。私は説得されていません-私は説得されることを期待していません。

まったく異なるタックについて、他のいくつかのポイントについてsizeof

  • C99とVLA(可変長配列)を使用している場合sizeof(vla)は、コンパイル時定数ではありません。注意してください!
  • Cプリプロセッサsizeofは、どちらが厄介であるかを理解していませんが、論理的です。
于 2008-12-19T07:17:27.883 に答える
0

変数のサイズを取得すると、予期しない結果が生じる可能性があります。変数が配列の場合、sizeof(array)は、個々の要素のサイズやポインターのサイズではなく、配列のサイズを返します。ポインタのサイズを取得すると、ポインタのサイズが返されます。ただし、配列は通常、渡されるときにポインタとして表されるため、混乱する可能性があります。

于 2008-12-17T03:37:24.007 に答える
0

ビジネス ロジックによって選択が定義されます。

  1. コードが特定の変数を参照していて、この変数がないとコードが意味をなさない場合 - 選択してくださいsizeof(var)

  2. 特定のタイプの変数のセットをコードで扱う場合は、 を選択しますsizeof(type)typedef通常、これは、型に基づいて異なる方法で処理する多くの変数を定義するがある場合に必要です(例: シリアライゼーション)。これらの変数のどれが将来のコード バージョンに残るかわからない可能性があるため、引数として型を選択することは論理的に正しいことです。そのようなものを変更しても、回線typedefには影響しません。sizeof

于 2014-05-20T11:09:58.280 に答える