VS C++字节对齐与内存投射

VS C++字节对齐方式

VS C++默认四字节对齐,在新建数据结构的时候,如下新建两个数据结构:

typedef struct STRUCT_STREAM_BYTE{
    char byte1;
    char s_precision[4];
    char ubyte1;
    char d_byte[2];
}stream_Byte;
typedef struct STRUCT_DATA_BYTE{
    char byte1;
    float s_precision;
    unsigned char ubyte1;
    short d_byte;
}data_Byte;

此时如下新建两个实例:

stream_Byte* bytes=new stream_Byte;
data_Byte* datas=new data_Byte;

s i z e o f ( ∗ b y t e s ) = s i z e o f ( ∗ d a t a s ) ? sizeof(*bytes)=sizeof(*datas)? sizeof(bytes)=sizeof(datas)?

一般人肯定会以为这两个实例在空间里所占的内存是一样的,还有人像这样做字符投射:

	stream_Byte* b_stream=(stream_Byte*)malloc(sizeof(stream_Byte));
	b_stream->byte1=0XBB;
	memset(b_stream->s_precision,0X30,sizeof(b_stream->s_precision));
	b_stream->ubyte1=0XBB;
	memset(b_stream->d_byte,0X11,sizeof(b_stream->d_byte));
	data_Byte* m_pro=(data_Byte*)b_stream;
	char byte1_get=m_pro->byte1;
    float s_precision_get=m_pro->s_precision;
    unsigned char ubyte1_get=m_pro->ubyte1;
    short d_byte_get=m_pro->d_byte;

这样获取的数据是正确的吗?
按照直观层面的意义,也就是我们理解的内存,肯定以为这样是正确的,然后来进行操作,可是在Visual Studio环境下竟然取出了错误的数据,难道内存投射出问题了吗?
其实不是这个样子的,Visual Studio默认的是四字节对齐,所以
s i z e o f ( ∗ b y t e s ) ≠ s i z e o f ( ∗ d a t a s ) sizeof(*bytes)≠sizeof(*datas) sizeof(bytes)=sizeof(datas)
s i z e o f ( ∗ b y t e s ) = 7 sizeof(*bytes)=7 sizeof(bytes)=7
s i z e o f ( ∗ b y t e s ) = 12 sizeof(*bytes)=12 sizeof(bytes)=12
此时应该加入如下代码保证一字节对齐

	#ifdef WIN32
	#pragma pack(1)
	#ednif

此时才可以进行完美的内存投射
s i z e o f ( ∗ b y t e s ) = s i z e o f ( ∗ d a t a s ) sizeof(*bytes)=sizeof(*datas) sizeof(bytes)=sizeof(datas)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

J6wuli

掉头发容易,挣钱难,跪求打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值