dポイントプレゼントキャンペーン実施中!

C++プログラマーとしてはとっても恥ずかしいタイトルですが。。。

Borland C++ Builder 9でアプリ開発してます。
訳あって、既存のアプリ(BCB6)を改造して別のアプリを作る業務を引き継いだのですが、修正する度に可笑しな動作をするのでソースを調べてみたら。。。
『boolとBOOLが混在してる(・・;)』
「ダメダメアプリ」に頭を抱えている今日この頃です。

前置きはさておき、質問ですが、
この「ダメダメアプリ」の中に2種類の構造体
typedef struct _TEST_A{
bool flag;
char ch[45];
}TEST_A;

typedef struct _TEST_B{
BOOL flag;
char ch[45];
}TEST_B;
があるのですが、それぞれsizeof()でサイズを計算すると、
sizeof(TEST_A) = 46
sizeof(TEST_B) = 52
という結果になりました。
BOOLは4バイトなので49バイトかと思ったのですが、
TEST_Bが52になる理由がわかりません。

どなたかわかる方いらっしゃったら教えてください。

A 回答 (3件)

構造体のサイズは、メンバのサイズの和では無いからです。



Google等でキーワード「構造体のサイズ」で検索をかけると、
答えが見つかるはずです。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございました。
キーワードで検索して納得しました。

お礼日時:2009/02/06 17:48

C/C++の基本ですね。


構造体やクラスなどはコンパイラによって、
パディング処理が行われ、
バイトアライメントが起こります。
回避方法は環境によって異なります。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございました。
納得しました。

お礼日時:2009/02/06 17:52

それは、同じソース上にありますか?


また、コンパイルオプションなども一緒ですか?
サイズからすると、メモリセグメンテーションによるもののようですが。
単純に書くと、「メモリ管理上キリのいい単位でアクセスできる場所ににメモリ確保していくため、構造体要素の合計サイズにならない」ということです。
とりあえず、「bool」と「BOOL」をsizeof()でサイズをチェックしてください。
bool=1、BOOL=4or1になると思います。

セグメンテーションが「4」であれば、
flagは先頭から1番地目に取られますが、ch[]は1番地目ではなく、キリのいい4番地目から確保されます。
このとき、確保されるサイズも45ではなく、キリのいい48で確保されます。
そのため「4+48=52」となります。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございました。
納得しました。

お礼日時:2009/02/06 17:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!