🈳

パディングビット(padding bits)を分かりやすく

2023/10/13に公開

パディングビットとは?

あるデータ型がメモリ上で占めるビットの中で、そのデータの実際の値を表現するのに使用されないビットを指し、主にアラインメントのために使用されますchar型と、その派生型であるsigned char型とunsigned char型には、padding bitsが存在しません。

👇アラインメントについては以下を参照
https://zenn.dev/hyppyboy/articles/8e8e1289cd89c7

例:構造体のパディングビット

パディングビットは、構造体や共用体を使用するときに特に見られます。
例として、以下のような構造体を考えます:

Copy code
struct s_example {
    char a;      // 1バイト
    int b;       // 通常は4バイト
};

多くのシステムでは、int型は4バイトの境界にアラインされる必要があります。そのため、aの後に3バイトのパディングビットが追加されます。これにより、bが4バイトのアラインメントに配置されます。

このパディングビットが問題となるのは、上記の構造体のサイズを直感的に計算し、「5バイト」と思い込んでしまう場合です。実際には、sizeof(struct s_example) 8バイトとなります。このような違いが問題を引き起こす可能性があります。

また、このパディングビットがどのようなビット値で埋められるかは、コンパイラやアーキテクチャに依存します。

int型などの基本データ型にはパディングビットが存在する?

理論的には、char以外のintlongshortfloatdoubleなどの他の基本データ型はパディングビットを持つ可能性があります。しかし、ほとんどの現代のコンピューターアーキテクチャでは、これらのデータ型はパディングビットを持っていません。(例えば、ほとんどの場合int型は 32 ビット全てを実際の値を表現するために使用しています。)char以外の基本データ型がパディングビットを持つのは、極めて特殊なハードウェアや非標準的なC言語の実装に限られます

パディングビットが、char型には存在しなくて、その他のデータ型には存在しうる理由

char型にパディングビットが存在しないのは、C言語の規格によってchar型のサイズが1バイトに固定されている からです。1バイトのchar 型はそのままで最も小さいアラインメント要件を満たします。したがって、char 型にパディングビットが追加される必要はありません。

一方、intlongfloatdoubleなどのデータ型のサイズは、C言語の規格では固定されておらず、アーキテクチャやコンパイラによって異なるサイズを持つことが許容されています。 そのため、これらのデータ型のサイズがハードウェアのアラインメント要件に合致しない場合、パディングビットが発生することがあります。

例えば、ほとんどの環境ではint32ビットですが、極めて特殊な環境では、int28ビットを使用し、アラインメントのために4ビットのパディングビットが発生する、といった状況が考えられます。

記事を読む上での注意点

この記事は、書籍やネット上の記事、ChatGPT、Perplexityなどから作成した私の学習ノートです。
私はまだ経験の浅い学生であり、記述に誤りがあるかもしれません。
もし誤りを見つけた場合は、コメント欄でご指摘いただけると幸いです。
よろしくお願いします🙇‍♂️

参照

https://stackoverflow.com/questions/58435348/what-is-bit-padding-or-padding-bits-exactly
https://www.perplexity.ai/search/C-Standards-Specifications-E2jTSIGkRRmmyeqPXBGCJQ?s=c
https://learn.microsoft.com/en-us/cpp/cpp/data-type-ranges?view=msvc-170
https://en.wikipedia.org/wiki/C_data_types

Discussion