メモリを操作するときにsizeof(char)を掛ける必要がありますか?
-
06-07-2019 - |
質問
mallocを使用して同様のメモリ操作を行う場合、sizeof(char)が常に1であることを信頼できますか?
たとえば、 char
型のN個の要素にメモリを割り当てる必要があります。 sizeof(char)
を掛ける必要があります:
char* buffer = malloc( N * sizeof( char ) );
またはsizeof(char)が常に1であり、乗算をスキップすることに依存することができます
char* buffer = malloc( N );
sizeof
がコンパイル中に評価され、コンパイラーが乗算をコンパイルアウトする可能性があることを完全に理解しているため、パフォーマンスの低下は最小限に抑えられ、ほとんどの場合ゼロになります。
主にコードの明快さと移植性について尋ねています。この乗算は、 char
型にはこれまでに必要ですか?
解決
必要ではありませんが、コードを読みやすくし、マジックナンバーの使用を避けるため、sizeof(char)に残すことをお勧めします。また、コードを後で変更して、文字の代わりに何かのサイズをそのオブジェクトのポインターに割り当てる必要がある場合は、単に「1」を持っている場合よりもコードを変更する方が簡単です。
他のヒント
定義では、sizeof(char)は常に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);
ポインターの種類に関係なく機能するため。
sizeof(char)
は、メモリ操作の種類に関係なく常に1です。
ただし、 sizeof(TCHAR)
はコンパイラオプションによって異なる場合があります。
アンチパターンのようなものだと思います。プログラマーが自分が何をしているかをよく知らなかったことを示し、それはすぐに残りのコードを疑わしい光で投げかけます。
確かに、(ウィキペディアを引用して)「無効」ではありませんが、「最適からはほど遠い」と思います。実行時に費用はかかりませんが、不要なジャンクでコードが乱雑になり、その間、誰かが必要だと思ったことを知らせます。
また、式は関数呼び出しとして解析されないことに注意してください。 sizeof
は関数ではありません。魔法のシンボル char
を渡す関数を呼び出していません。組み込みの単項接頭辞演算子 sizeof
を式に適用しています。この場合、式は char
型へのキャストであり、Cでは次のように記述されます。 (char)
。
他の式で sizeof
を使用することは完全に可能であり、可能な限り強くお勧めします。そうすると、式の値のサイズが得られます。
char a;
printf("A char's size is %u\n", (unsigned int) sizeof a);
これは、すべての準拠C実装で、常に 1
を出力します。
また、David Cournapeauに強く同意し、 name を malloc()
呼び出しで繰り返し、またアンチパターン。
の代わりに
char *str;
str = malloc(N * sizeof (char));
多くの人がN文字容量の文字列バッファを割り当てるために書くと思います、私は行きます
char *str;
str = malloc(N * sizeof *str);
または(文字列のみ)上記のように sizeof
を省略しますが、これはもちろんより一般的であり、どのタイプのポインターでも同様に機能します。
必要はありません。 こちら(例)をご覧ください。
sizeof(char)
は、C標準で常に 1 (バイト)に定義されています。 sizeof
は多数のバイトを返すため、バイトあたりのビット数は無関係であることに注意してください(実際の用語では8です)。
他に留意すべきことは、コンパイラがsizeof(char)の値が1であることを静的に認識し、数値に静的1を乗算すると乗算が不要であることを意味することです。コンパイラはそれを最適化します。これらの理由を考慮して、パフォーマンスへの懸念を抱いてはいけません。
"新しいC標準から。経済的および文化的解説"。
- 統計:sizeofの2.0%は
char
から取得され、1.5%はunsigned char
から取得されます。 1.2バージョンの本の1033ページ。 - 1037ページ。
文字タイプの表現のビット数は 無関係です。定義により、番号 バイトの文字タイプは 1つ。
コーディングガイドライン 常に含むようにバイトを関連付けます 8ビット。ホスト上で 文字タイプは16ビットで、これは 誤った仮定につながる sizeofを文字タイプに適用する 値2を返します。 これらの問題は別の場所で議論されています。
sizeof(char)を使用すると、コードの読みやすさと移植性が向上します。
x86では、文字が1バイトであることは誰もが知っています。ただし、明示的に書き留めておくと、意図がより明確になります。これは常に良いことです。
また、文字が1バイトではない他のプラットフォームにコードが置かれた場合はどうなりますか。文字が4ビットだけだった場合はどうなりますか?
同意する必要はありませんが、実行時間が遅くなることはなく、まれにコードを別のアーキテクチャに移植する必要があります。