Cで構造体のサイズを変更する3つの異なる方法を見てきました.
typedef struct A {
int a, b;
} A;
sizeof(A); // method 1
sizeof(struct A); // method 2
A *p;
sizeof(*p); // method 3
これを行う最も適切な方法はどれですか? 効率と読みやすさを考慮してください。
可変長配列を使用する場合を除き、sizeof
100% コンパイル時間です。したがって、読みやすさ、わかりやすさ、安全性などに関する間接的なものを除いて、「効率」はありません。
私は、繰り返しが最も少なく、タイピングも最も少ないバージョンを好みます。したがって、ポインターが使用可能な場合、私は常に 3 番目の形式を使用しますが、括弧は必要ないため括弧なしで使用します。
例えば:
float *a = malloc(1000 * sizeof *a);
このようなコードはsizeof
、使用されているポインターに「ロック」することに注意してください。それに応じて、不一致のリスクが減少します。
sizeof(float)
コード likeまたは yourの括弧はsizeof(A)
、引数が型名の場合にのみ必要です。関数呼び出しのように見えるので、そうではないため、そのフォームを使用する必要がある場合は、常にスペースでフォーマットします。
void *p = malloc(1000 * sizeof (float));
は関数でsizeof
はないことに注意してください。
sizeof
コンパイル時(*)に評価されるため、すべて同等に効率的です。
あなたの質問の残りの部分は、コーディング スタイルについてです。
構造体に typedef を使用するかどうかについては、2 つの陣営が議論しています。ある陣営 (特に Linux カーネル関係者) はstruct A
、typedef
. もう一方の陣営 (Linux 関係者を除くほぼ全員) は、そのtypedef
ほうが明確だと考えています。これらは主観的な意見であり、コンセンサス、正誤はありません。どちらの形でも構いません。
そして、sizeof(type_of_ptr)
またはsizeof(*ptr)
がより明確かどうかについて、別のコーディング スタイルの議論があります。繰り返しますが、コンセンサスはありません。これは主観的なコーディング スタイルです。
したがって、あなたの質問に対する答えは次のとおりです。コーディングスタイルの標準に依存します。コーディング標準が現在のプロジェクトに指示する形式のいずれか。
(*) sizeof VLA を除く
静的に宣言された配列のサイズを評価するために sizeof 演算子を使用する場合、これを 1 つの手の込んだ方法で行うことができますsizeof(some_type[some_size])
。
したがって、カスタム定義されたタイプがあるとしましょう:
struct some_struct {
int some_int;
};
次に、最も単純でコンパイル可能なプライマーでは、次のようなものを使用できます。
#define PREFERABLE_SIZE 1000
int main(const int argc, const char *argv[static const 1])
{
return sizeof(struct some_struct[PREFERABLE_SIZE]);
/* Or you may do this with some base type (i.e, float) */
/* return sizeof(float[PREFERABLE_SIZE]); */
}
sizeof(some_type[some_size])
と同等some_size * sizeof(some_type)
です。私としては、前者の方が後者よりもはるかに好ましく、「きれい」です。
ここでの typedef は無意味であり、sizeof の重要な使用法を見逃したという事実を曖昧にしています。typedef を使用せず、代わりに変数のサイズの取得について質問しているふりをします。たとえば、A
type という名前の変数があるとしますstruct A
。
読みやすさに関しては、すべてコンテキスト (および個人的な好み) に依存します。メモリを割り当てるときは、3 を使用する方が読みやすい:
p = malloc( sizeof *p );
構造体のサイズを決定しようとするときは、2 を使用することをお勧めします (ただし、方法 2 はほとんど望ましくないため、これは非常に不自然な例です)。
char *ptr; /* eventually points to an array of struct A */
ptr += sizeof( struct A );
変数のサイズを知りたい場合は、方法 1 を使用します。
void *ptr = malloc( COUNT * sizeof A );
実際には、ほとんどの場合、方法 3 が推奨されます。(個人的な意見の表明です。)
簡単に言えば、サイズを計算している理由を判断してください。これにより、「読み取り可能」の定義が促進されます。