組み込み技術者のための資格試験,傾向と対策(4) ―― Androidの登場で注目高まるETEC(組込み技術者試験制度)

久保 幸夫

tag: 組み込み

コラム 2010年12月17日

参考問題と解答・解説

 以下の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関連資格講師

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日