现在的位置: 首页 > 综合 > 正文

MemAlign内存对齐

2013年03月16日 ⁄ 综合 ⁄ 共 2058字 ⁄ 字号 评论关闭
// MemAlign.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

struct MyStruct 
{ 
double dda1; 
char dda; 
int type;
}; 

#pragma pack(push) //保存对齐状态 
#pragma pack(4)//设定为4字节对齐 
struct Test 
{ 
char m1; 
double m4; 
int m3; 
}; //0,4~11,12~15....16
#pragma pack(pop)//恢复对齐状态 

struct MyStruct2 
{ 
	char dda; 
	double dda1; 
	int type;

};

int memoffset(void* pa,void* pb)
{
	return (char*)pb-(char*)pa;
}

int main(int argc, char* argv[])
{
	MyStruct  obj;
	printf("int size:%d\n",sizeof(int));//4
	printf("char size:%d\n",sizeof(char));//1
	printf("double :%d\n",sizeof(double));//8
	printf("MyStruct size:%d\n",sizeof(MyStruct));//4+4+8=16
	{
		printf("obj:%x,obj->dda1 :%x,offset:%d\n",&obj,&obj.dda1, memoffset(&obj,&(obj.dda1)) );//0
		printf("obj:%x,obj->dda :%x,offset:%d\n",&obj,&obj.dda,memoffset(&obj,&(obj.dda)));//8
		printf("obj:%x,obj->type :%x,offset:%d\n",&obj,&obj.type,memoffset(&obj,&(obj.type)));//12
	}
	MyStruct2  obj2;
	printf("MyStruct2 size:%d\n",sizeof(MyStruct2));//0,8,16......8+8+4=20?24!
	{
		printf("obj2:%x,obj2->dda :%x,offset:%d\n",&obj2,&obj2.dda,memoffset(&obj2,&(obj2.dda)));//
		printf("obj2:%x,obj2->dda1 :%x,offset:%d\n",&obj2,&obj2.dda1, memoffset(&obj2,&(obj2.dda1)) );//		
		printf("obj2:%x,obj2->type :%x,offset:%d\n",&obj2,&obj2.type,memoffset(&obj2,&(obj2.type)));//

	}
///////////////////////////
	Test objtest;
	printf("Test size:%d\n",sizeof(Test));////0,4~11,12~15....16
	{
		printf("objtest:%x,objtest->m1 :%x,offset:%d\n",&objtest,&objtest.m1,memoffset(&objtest,&objtest.m1));//
		printf("objtest:%x,objtest->m4 :%x,offset:%d\n",&objtest,&objtest.m4, memoffset(&objtest,&objtest.m4) );//		
		printf("objtest:%x,objtest->m3 :%x,offset:%d\n",&objtest,&objtest.m3,memoffset(&objtest,&objtest.m3));//

	}

	return 0;
}

/*
int size:4
char size:1
double :8
MyStruct size:16
obj:12ff70,obj->dda1 :12ff70,offset:0
obj:12ff70,obj->dda :12ff78,offset:8
obj:12ff70,obj->type :12ff7c,offset:12
MyStruct2 size:24
obj2:12ff58,obj2->dda :12ff58,offset:0
obj2:12ff58,obj2->dda1 :12ff60,offset:8
obj2:12ff58,obj2->type :12ff68,offset:16
Test size:16
objtest:12ff48,objtest->m1 :12ff48,offset:0
objtest:12ff48,objtest->m4 :12ff4c,offset:4
objtest:12ff48,objtest->m3 :12ff54,offset:12
Press any key to continue
*/

抱歉!评论已关闭.