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)