○構造体

//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++