MemAlign内存对齐

本文通过C++代码示例介绍了内存对齐的概念及其对结构体成员变量内存布局的影响。展示了不同编译指令下结构体大小的变化,并通过具体实例分析了成员变量的偏移量,有助于理解内存对齐在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值