对齐结构体中各个变量在内存中的地址必须符合对齐规则

内存地址  时间:2021-01-12  阅读:()

1 、结构体中各个变量在内存中的地址必须符合“对齐规则”如long型起始地址必须能够被4整除。

2、结构体中各个变量在内存中的位置随声明顺序依次递增。

3、 结构的长度必须为所用过的所有对齐参数的整数倍不够就补空字节.

4、 不仅可以计算出所占内存的大小 还可以知道各个变景的具体位置。

5、 总之两个对齐各个变景&结构整体

我和史岩讨论的结论用最大的盒子依次装东西装不下时启用新盒子。

这种方法建立在试验基础上没有理论依据不科学例如struct pro

(charc;inta;chard;doubles;

}

占用内存大小为  正确答案为 24

6、使用伪指令#pragma pack(n),C编译器将按照n个字节对齐。

使用伪指令#pragma pack(),取消自定义字节对齐方式。

7、 Struct Number Al ignment在VC中可以设置。

8、对于结构体中嵌套结构体的如下struct examplel

(chara;long b;

};struct example2

(charc;example1 struct1;

short e;

 

相当丁把structl中的元素依次放到structl的位置但是structl还是一个整体的概念 chara和char c不能放在一个单元中。

9、对丁结构体中嵌套数组 贝U相当丁把数组内的元素放置到数组所在的位置,数组内的元素可能和外面的元素合用一个内存单元

为了能使CPLM变量进行高效快速的访问变量的起始地址应该具有某些特 ANSI C保证结构体性 即所谓的“对齐”丁4字节边界上 统) 中各字段在内存中Type char short (16-bit) int and long (32-bit)float double structures 出现的位置是随它

们的声明顺序依次

递增的并且第一

个字段的首地址等

丁整个结构体实例

的首地址。

。例如对丁4字节

的int类型变量

其起始地址应位即起始地址能够被4整除。变量的对齐规则如下(32位系

Al ignment

在字节边界上对齐

在双字节边界上对齐

在4字节边界上对齐

在4字节边界上对齐

在8字节边界上对齐

单独考虑结构体的个成员它们在不同的字节边界上对齐。

其中最大的字节边界数就是该结构的字节边界数。

MSD原话 Largest al ignment requirement of any member

理解结构体的对齐方式有点挠头如果结构体中有结构体成员那么这是一个递归的过程。

#pragma pack规定的对齐长度实际使用的规则是

结构联合或者类的数据成员第一个放在偏移为 0的地方 以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中 比较小的那个进行。

也就是说 当#pragma pack的值等丁或超过所有数据成员长度的时候这个值的大小将不产生任何效果。

而结构整体的对齐则按照结构体中最大的数据成员 和#pragma pack指定值之间较小的那个进行。

具体解释

#pragma pack(4)class TestB

{publ ic:int aa; // 第一个成员放在0,3偏移的位置char a; // 第二个成员 自身长为1,#pragma pack(4),取小值也就是1,所以这个成员按一字节对齐放在偏移4的位置。short b; //第三个成员 自身长2,#pragma pack(4),取2,按2字节对齐所以放在偏移6,7的位置。charc; // 第四个 自身长为1,放在8的位置。

};

这个类实际占据的内存空间是9字节

类之间的对齐是按照类内部最大的成员的长度和#pragmapack规定的值之中较小的一个对齐的。

所以这个例子中类之间对齐的长度是 min(sizeof(int),4) 也就是4。9按照4字节圆整的结果是12,所以sizeof(TestB)是12。

如果

#pragma pack(2)class TestB

{publ ic:intaa; // 第一个成员放在0,3偏移的位置char a; // 第二个成员 自身长为1,#pragma pack(4),取小值也就是1,所以这个成员按一字节对齐放在偏移4的位置。short b; //第三个成员 自身长2,#pragma pack(4),取2,按2字节对齐所以放在偏移6,7的位置。charc; // 第四个 自身长为1,放在8的位置。

};

〃可以看出上面的位置完全没有变化只是类之间改为按 2字节对齐 9按2圆整的结果是10。

//所以sizeof(TestB)是10。

最后看原贴

现在去掉第一个成员变量为如下代码

#pragma pack(4)class TestC

{publ ic:chara;//第一个成员放在0偏移的位置short b;// 第二个成员 自身长2,#pragma pack(4),取2,按2字节对齐所以放在偏移2,3的位置。charc;//第三个 自身长为1,放在4的位置。

};

//整个类的大小是5字节按照min(sizeof(short),4) 字节对齐也就是2字节对齐结果是6

//所以sizeof(TestC)是6。

成员对齐有一个重要的条件 即每个成员按自己的方式对齐.其对齐的规则是,每个成员按其类型的对齐参数通常是这个类型的大小和指定对齐参数这里默认是8字节中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍不够就补空字节.” 引用

JustHost,最新高性价比超便宜俄罗斯CN2 VPS云服务器终身8折优惠,最低仅8元/月起,200Mbps带宽不限流量,五大机房自助自由切换,免费更换IP,俄罗斯cn2vps怎么样,justhost云服务器速度及综合性能详细测评报告

主机参考最新消息:JustHost怎么样?JustHost服务器好不好?JustHost好不好?JustHost是一家成立于2006年的俄罗斯服务器提供商,支持支付宝付款,服务器价格便宜,200Mbps大带宽不限流量,支持免费更换5次IP,支持控制面板自由切换机房,目前JustHost有俄罗斯5个机房可以自由切换选择,最重要的还是价格真的特别便宜,最低只需要87卢布/月,约8.5元/月起!just...

可抵御99%的攻击中国单域版cdn:9元/月7T防御 cloudsecre

官方网站:点击访问CDN客服QQ:123008公司名:贵州青辞赋文化传媒有限公司域名和IP被墙封了怎么办?用cloudsecre.com网站被攻击了怎么办?用cloudsecre.com问:黑客为什么要找网站来攻击?答:黑客需要找肉鸡。问:什么是肉鸡?答:被控的服务器和电脑主机就是肉鸡。问:肉鸡有什么作用?答:肉鸡的作用非常多,可以用来干违法的事情,通常的行为有:VPN拨号,流量P2P,攻击傀儡,...

腾讯云爆款秒杀:1C2G5M服务器38元/年,CDN流量包6元起

农历春节将至,腾讯云开启了热门爆款云产品首单特惠秒杀活动,上海/北京/广州1核2G云服务器首年仅38元起,上架了新的首单优惠活动,每天三场秒杀,长期有效,其中轻量应用服务器2G内存5M带宽仅需年费38元起,其他产品比如CDN流量包、短信包、MySQL、直播流量包、标准存储等等产品也参与活动,腾讯云官网已注册且完成实名认证的国内站用户均可参与。活动页面:https://cloud.tencent.c...

内存地址为你推荐
电信主机租用主机代管有什么特点?vps虚拟主机请通俗解析一下虚拟主机,VPS和云主机?它们各有什么用途?中文域名注册查询怎么查我们公司的中文域名是被谁注册的?英文域名英文域名与中文域名有啥区别免费国内空间想做一个网站想找个免费的空间最好是国外的,国内的太多都是骗人的或者不稳定的。谢谢!美国vps租用如何选择国外vps服务器?网站空间价格我想自己弄个小网站,但我不会懂域名和买空间价格,便宜一点的一共要多少钱?手机网站空间谁有上手机网站刷空间人气的网址免备案虚拟主机免备案的虚拟主机在哪买好100m虚拟主机万网和新网虚拟主机有100M的吗
山东虚拟主机 个人域名注册 南通服务器租用 备案域名出售 bbr windows主机 密码泄露 免费个人博客 免费ftp站点 web服务器架设 jsp空间 idc是什么 域名评估 新家坡 lol台服官网 什么是服务器托管 卡巴斯基免费试用版 重庆电信服务器托管 智能dns解析 帽子云排名 更多