16

malloc を使用して同様のメモリ操作を行う場合、sizeof( char ) が常に 1 であることに依存できますか?

たとえば、 type の N 個の要素にメモリを割り当てる必要がありcharます。必要に掛けていsizeof( char )ます:

char* buffer = malloc( N * sizeof( char ) );

または、 sizeof( char ) が常に 1 であることを信頼して、乗算をスキップできますか

char* buffer = malloc( N );

コンパイル中に評価されることを完全に理解してsizeofおり、コンパイラは乗算をコンパイルすることさえできるため、パフォーマンスの低下は最小限に抑えられ、ほとんどの場合ゼロになります。

私は主にコードの明瞭さと移植性について質問しています。この乗算は型に必要ですcharか?

4

8 に答える 8

29

定義により、sizeof(char) は常に 1 です。1 バイトは、1 バイトのビット数 (一般的なデスクトップ CPU では 8) に関係なく、C の文字のサイズです。

1 バイトが 8 ビットでない典型的な例は、PDP-10など、9/36 ビット バイトの古いミニコンピューターのようなアーキテクチャです。しかし、2^N 以外のバイトは非常に珍しくなっていると思います

また、これはより良いスタイルだと思います:

char* buf1;
double* buf2;

buf1 = malloc(sizeof(*buf1) * N);
buf2 = malloc(sizeof(*buf2) * N);

ポインターの型が何であれ機能するためです。

于 2009-06-18T09:48:26.427 に答える
14

sizeof(char)どのタイプのメモリ操作を行っても、常に 1 です。

ただし、sizeof(TCHAR)コンパイラ オプションによって異なる場合があります。

于 2009-06-18T09:48:17.893 に答える
12

一種のアンチパターンだと思います。これは、プログラマーが自分が何をしているのかよくわからなかったことを示しており、コードの残りの部分がすぐに疑わしい光にさらされます。

確かに、それは(ウィキペディアを引用して)「効果がない」わけではありませんが、「最適とはほど遠い」と思います。実行時に何も費用はかかりませんが、誰かがそれが必要だと思ったことを知らせている間、それは不必要ながらくたでコードを乱雑にします。

また、式は関数として解析されないことに注意してください-call:sizeofは関数ではありません。魔法のシンボルを渡す関数を呼び出しているのではありませんchar。組み込みの単項接頭辞演算子sizeofを式に適用しています。この場合、式は型へのキャストcharであり、Cでは。として記述され(char)ます。

他の式で使用することは完全に可能であり、可能な場合はいつでも強くお勧めしますsizeof。そうすると、式の値のサイズが得られます。

char a;
printf("A char's size is %u\n", (unsigned int) sizeof a);

これにより1、常に、準拠しているすべてのC実装に出力されます。

また、David Cournapeauに強く同意し、-callで型名を繰り返すこと一種のアンチパターンであると考えています。malloc()

それ以外の

char *str;

str = malloc(N * sizeof (char));

多くの人がN文字容量の文字列バッファを割り当てるために書くだろう、私は

char *str;

str = malloc(N * sizeof *str);

または(文字列の場合のみ)上記のように省略しますsizeofが、これはもちろんより一般的であり、どのタイプのポインターでも同様に機能します。

于 2009-06-18T10:12:58.967 に答える
7

必須ではありませんが、 sizeof( char ) を残すことをお勧めします。これにより、コードが読みやすくなり、マジック ナンバーの使用を回避できるからです。また、char の代わりに何かのサイズをそのオブジェクトのポインターに malloc するように後でコードを変更する必要がある場合は、「1」だけの場合よりもコードを変更する方が簡単です。

于 2009-06-19T08:40:02.640 に答える
6

それは必要ない。こちらをご覧ください(例)。

sizeof(char)C 標準では、常に1 (バイト) と定義されています。バイトsizeof数を返すため、1 バイトあたりのビット数は無関係であることに注意してください(実際には 8 です)。

于 2009-06-18T09:47:26.007 に答える
3

他に覚えておくべきことは、コンパイラは sizeof (char) の値が 1 であることを静的に認識していることと、数値に静的な 1 を乗算することは、乗算を行う必要がないことを意味することも認識していることです。コンパイラはそれを最適化します。これらの理由から、パフォーマンスに関する懸念は考慮に入れるべきではありません。

于 2009-06-18T15:55:20.040 に答える
3

「新しい C 標準。経済的および文化的解説」より。

  1. 統計: sizeof の 2.0% が から取得されchar、1.5%が から取得されunsigned charます。本の 1.2 バージョンの 1033 ページ。
  2. 1037ページ。

文字タイプの表現におけるビット数は関係ありません。定義により、文字タイプのバイト数は 1 です。

コーディングのガイドライン 開発者は、1 バイトを常に 8 ビットを含むものとして関連付けることがあります。文字型が 16 ビットのホストでは、これにより、文字型に sizeof を適用すると値 2 が返されるという誤った想定につながる可能性があります。これらの問題については、別の場所で説明しています。

于 2010-02-07T01:40:59.687 に答える
-4

sizeof(char) を使用すると、コードが読みやすく移植しやすくなります。

x86 では、1 文字が 1 バイトであることは誰もが知っています。ただし、明示的に書き留めておくと、意図がより明確になります。これは常に良いことです。

また、文字が 1 バイトではない他のプラットフォームにコードが配置された場合はどうなるでしょうか。文字が 4 ビットしかない場合はどうなるでしょうか?

同意する必要はありませんが、実行時間が遅くなることはありません。コードを別のアーキテクチャに移植する必要があるというまれなケースでは効果があります。

于 2009-06-18T11:13:15.787 に答える