組み込み技術者のための資格試験,傾向と対策(4) ―― Androidの登場で注目高まるETEC(組込み技術者試験制度)
参考問題と解答・解説
問 以下のC言語で記述された構造体が,メモリ上に配置されたときの全体のサイズは何バイトになるか? なお,intは16ビットとする.
struct hogehoge
{
int i_data;
char c_data;
};
ア 3バイト
イ 4バイト
ウ 8バイト
エ 分からない
解答
答えはどれでしょう? 8ビットのPICマイコンを使ってプログラミングしている人は,3バイトと答えるかもしれません.H8マイコン(16ビット)を使っている人は4バイト,Win32環境でx86系のプログラミングをしている人は,8バイトと答えるかもしれません.
さあ,3バイトでしょうか? 4バイト? それとも8バイトでしょうか? えっ? 分からないって??
そう,「分からない」と思ったあなた,正解です.答えはプロセッサによって異なるので,エの「分からない」(不定)が正解です.
解説
プロセッサがメモリを扱う場合,プロセッサごとにある決められた区切りに合わせてメモリに格納されます.これをバイト境界と呼びます.このバイト境界をまたいで,変数を格納することはできません.そのため,そのため,構造体や配列をメモリ上に配置する場合,バイト境界をまたがないように,パディングと呼ぶ「詰め物」が挿入され,メンバ変数の並びが調整されて配置される場合があります(これを構造体のアライメントと呼ぶ).

図3 バイト境界の違いによるメモリ上の構造体(例)
よって,プロセッサによってメモリ上の構造体のサイズは異なってきます.そのため,答えは,プロセッサに依存しますので,プロセッサの情報が与えられないかぎり「分からない」が正解となります.ちなみに,こんな人を食ったような問題は実際のETEC試験では出ません.
この問題は,経験が浅いエントリ・レベルの人にとっては,けっこう難しい問題かと思います.なにしろ,初心者にとっては,構造体を勉強するだけで精一杯でしょうし,このようなことは,C言語の入門書には書いていないことが多いと思います(もっとも,組み込みプログラミングを意識したC言語の本には,大抵載っている).また,自信をもって,イやウと答えた人は,異なるアーキテクチャのプロセッサを使用した経験がない方でしょうか.他のプロセッサへ移植する場合,このような知識がないと,不具合の原因となる場合があります.
一見,何の変哲もないコードの中にも,組み込み特有の「落とし穴」が埋もれています.しかし,このような「落とし穴」を知らないと,必要なメモリの見積もりを誤ったり,メモリ効率が悪いプログラムや移植性の悪いプログラムを作ったりすることになります.このような「落とし穴」は,経験を積んだ技術者には当たり前の知識かもしれません.でも,「sizeof関数を適切に使って組めば,バイト境界が異なっても大丈夫!」とおっしゃる経験豊富な方でも,1度や2度はハマった経験があるかと思います.結局,経験というのは「失敗の経験」なのかもしれませんね.
くぼ・ゆきお
組み込み&IT関連資格講師
tag: 技術教育