1

Cで構造体のサイズを変更する3つの異なる方法を見てきました.

typedef struct A {
    int a, b;
} A;


sizeof(A); // method 1

sizeof(struct A); // method 2

A *p; 
sizeof(*p); // method 3

これを行う最も適切な方法はどれですか? 効率と読みやすさを考慮してください。

4

4 に答える 4

8

可変長配列を使用する場合を除き、sizeof100% コンパイル時間です。したがって、読みやすさ、わかりやすさ、安全性などに関する間接的なものを除いて、「効率」はありません。

私は、繰り返しが最も少なく、タイピングも最も少ないバージョンを好みます。したがって、ポインターが使用可能な場合、私は常に 3 番目の形式を使用しますが、括弧は必要ないため括弧なしで使用します。

例えば:

float *a = malloc(1000 * sizeof *a);

このようなコードはsizeof、使用されているポインターに「ロック」することに注意してください。それに応じて、不一致のリスクが減少します。

sizeof(float)コード likeまたは yourの括弧はsizeof(A)、引数が型名の場合にのみ必要です。関数呼び出しのように見えるので、そうではないため、そのフォームを使用する必要がある場合は、常にスペースでフォーマットします。

void *p = malloc(1000 * sizeof (float));

は関数でsizeofはないことに注意してください。

于 2013-04-29T12:42:08.387 に答える
1

sizeofコンパイル時(*)に評価されるため、すべて同等に効率的です。

あなたの質問の残りの部分は、コーディング スタイルについてです。

構造体に typedef を使用するかどうかについては、2 つの陣営が議論しています。ある陣営 (特に Linux カーネル関係者) はstruct Atypedef. もう一方の陣営 (Linux 関係者を除くほぼ全員) は、そのtypedefほうが明確だと考えています。これらは主観的な意見であり、コンセンサス、正誤はありません。どちらの形でも構いません。

そして、sizeof(type_of_ptr)またはsizeof(*ptr)がより明確かどうかについて、別のコーディング スタイルの議論があります。繰り返しますが、コンセンサスはありません。これは主観的なコーディング スタイルです。

したがって、あなたの質問に対する答えは次のとおりです。コーディングスタイルの標準に依存します。コーディング標準が現在のプロジェクトに指示する形式のいずれか。


(*) sizeof VLA を除く

于 2013-04-29T12:58:45.700 に答える
0

静的に宣言された配列のサイズを評価するために 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)です。私としては、前者の方が後者よりもはるかに好ましく、「きれい」です。

于 2013-04-29T13:37:19.467 に答える
0

ここでの typedef は無意味であり、sizeof の重要な使用法を見逃したという事実を曖昧にしています。typedef を使用せず、代わりに変数のサイズの取得について質問しているふりをします。たとえば、Atype という名前の変数があるとします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 が推奨されます。(個人的な意見の表明です。)

簡単に言えば、サイズを計算している理由を判断してください。これにより、「読み取り可能」の定義が促進されます。

于 2013-04-29T12:54:40.630 に答える