C#调用C++结构体内存数据不对问题

牵扯到C++结构体内存分配问题。

结构体的成员变量若同时存在short、int、double型。

struct A 
{ 
    int a;
    char b;
    short c;
}; 
struct B 
{ 
    char b;
    int a;
    short c;
}; 

顺序不同其内存空间大小分配是不一样的。int占4个字节,char占1个自己,short占2个字节。但struct A实际占用字节数也就是sizeof(struct A)为8,而B为12。

因为在结构体A中,a占用4个字节,b占用1个字节,c占用2个字节,而由于为了提高CPU存储变量的速度,实际上c是按照c的字节数也就是2字节对其的,所以b之后会空余1个字节。

但是如此以来B为何不是10字节而是12字节?首先说为什么是10字节。因为b占用1个字节,而a默认占用4个字节,所以默认a之前必须为4个字节长度的整数倍才能索引到a,即b后空余三个字节。至于c为何占用4个字节,是因为结构体之间的对齐要求结构体长度为结构体内最大长度的数据类型的长度的整数倍,在此示例中最长的数据类型为int。总结为:a默认对齐为4字节,因为b在a前面,b占1字节,所以b之后必须空余3字节,而因为整个结构体之间对齐必须为最长类型默认对齐长度的整数倍,所以结构体B为12字节。

若要改变内存占用大小,最简单的方式为在结构体前加上pragma pack(1)这样读取速度会变慢但内存使用量会大量减少。

#pragma pack(1)//设定为4字节对齐
struct B 
{ 
    char b;
    int a;
    short c;
}; 

此时sizeof(struct B)为7;

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值