構造体の応用として、ワードアライメントの話とビットフィールドの話をする。
構造体のワードアライメント
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 ;