○構造体
//C++
struct data{
int a; //4byte
char b; //1byte
};
//C
typedef struct _data{
int a;
char b;
} data;
△自分自身のポインタを含めた書き方。
//C++
struct data{
data*c;//自分自身のポインタ
int a; //4byte
char b; //1byte
};
//C
typedef struct _data{
_data*c;//自分自身のポインタ
int a;
char b;
} data;
■構造体のデータ―構造
struct data{
char a[4];
char b[4];
char c[4];
};
int main(int argc, char* argv[])
{
char*str="abc\0def\0ghi\0";
data*a=(data*)str;
printf("%s\n",a->a );
printf("%s\n",a->b );
printf("%s\n",a->c );
return 0;
}
出力結果
abc
def
ghi
■構造体とパッキング(アライメント)
struct data{
int a; //4byte
char b; //1byte
};
int main(int argc, char* argv[])
{
data a;
a.a=11;
a.b='3';
//ファイル書き込み
FILE * fp=fopen("c:/test.txt","wb");
fwrite(&a,sizeof(char),sizeof(data),fp);
fclose(fp);
//ファイル読み込み
fp=fopen("c:/test.txt","rb");
fread(&a,sizeof(char),sizeof(data),fp);
fclose(fp);
printf("%d\n",a.a);
printf("%c\n",a.b);
return 0;
}
出力結果
11
3
▽上のプログラムを実行すると5byteの値がファイルに書き込まれるように見えますが
CPUの処理を最適にするために実際には、それよりも多くの値が書き込まれます。
(処理系により変わります)
▽コンパイラ命令
#pragma pack(8)//デフォルト
1,2,4,8,16の値を使ってパッキングを変更できます。
上のプログラムを調整してみると。
#pragma pack(1)
ファイルの出力結果 5byte
0B 00 00 00 33
#pragma pack(2)
ファイルの出力結果 6byte
0B 00 00 00 33 CC
#pragma pack(4)
ファイルの出力結果 8byte
0B 00 00 00 33 CC CC CC
▲トップページ
>
Windows と C++