ホーム » スタッフ » 斉藤徹 » 構造体のワードアライメントとビットフィールド

2005年10月
« 9月   11月 »
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

構造体のワードアライメントとビットフィールド

構造体の応用として、ワードアライメントの話とビットフィールドの話をする。

構造体のワードアライメント

struct A {
int  x ;
char n[ 5 ] ;
} ;
struct A array[ 100 ] ;
printf( "%d" , sizeof( array ) ) ;

この例が、900byte でなく 1200byte の場合もあるよ…ということで、 最近のコンピュータが、ワード単位でメモリをアクセスすることや、 ワード境界をまたがったメモリアクセスは、速度低下の可能性があることを説明。 メモリをパックして節約もできるという説明の時に『大量のメモリ使用がスワッピングを引き起こし速度低下の可能性がある』ことも説明する。

関連授業:計算機構成論、OS論

構造体のビットフィールド

struct YMD {
int  year ;
int  month ;
int  day ;
} ;

の構造体が、12byte メモリを消費することを説明し、メモリ節約のために int 型で表現したら、どうなるかを説明する。

/* int型で年月日を保存 */
/* 0000,0000,0000,YYYY,YYYY,YYYM,MMMD,DDDD */
int bday = (2005 ≪ 9) + (10 ≪ 5) + 28 ; /* 2005年10月28日 */
/* int型の年月日より抽出 */
int y = bday ≫ 9 ;           /* bitマスクをbit幅から作る  */
int m = (bday ≫ 5) & 0xF ;   /* (bday ≫ 5) & ((1U≪4)-1) */
int d = bday & 0x1F ;         /* bday & ((1U≪5)-1)        */
/* int型の年月日の月を2月に変更 ;
bday = (bday & 0xFFE1F) | (2 ≪ 5) ;
/* bday & ~(((1U≪4)-1) ≪ 5) | (2 ≪ 5) */

でも、説明していても、『年は何bitで表現できる?』の回答ができない学生もいる….

この面倒臭い式を説明した後、ビットフィールドの説明で閉める。

struct YMD {
unsigned int  year  : 11 ;
unsigned int  month :  4 ;
unsigned int  day   :  5 ;
} ;
struct YMD bday ;
/* 構造体への代入 */
bday.year = 2005 ; bday.month = 10 ; bday.day = 28 ;
/* 構造体の一部を修正 */
bday.month = 2 ;