永发信息网

一个关于C++的问题

答案:3  悬赏:0  手机版
解决时间 2021-05-04 03:36

为什么它的结果是 24 ?而不是21?

#include <iostream>
using namespace std;
class s{
int name;
string a;
char b;
}s1;
int main()
{
cout<<sizeof(s1)<<endl;
}

最佳答案

为了使CPU对变量的进行快速高效的访问,变量的起始地址应该满足某些特性,即所谓的对齐。关于字节对齐有两个重要的宏,#pragma pack (n)和#pragma pack 第一个宏是强制编译器一般以n的倍数进行地址对齐(还有特殊情况以小于n的字节数进行对齐),第二个宏结束前面设置的对齐方式,恢复到编译器默认的对齐方式。在Visual C++下默认的字节对齐数为8。
结构体中的变量item在结构体中相对于首地址的偏移量应该是 X 的倍数,X 由如下式子确定:X=min(n,sizeof(item)),举个例子(设n为8):struct Test { char c1; char c2; int i}; 如果定义了变量Test t ,那么在存储 t 的 i 时 X 就应该是min(8,sizeof(int))即为4的倍数,即 i 相对于结构体首地址的偏移量必须是4的倍数,所以 t 的大小就应该为8字节(在c1和c2后填充了两个字节以满足前述条件)。对于struct { char c1; char c2}不会出现填充的的情况,每个成员相对首地址的偏移量也满足是X的倍数(此时X为1),其大小为2字节。



你可以在baidu里面输入“结构体内存分配”“内存漏洞”等字样来检索相关知识进行学习。

全部回答

对齐问题

例如

struct {char b; double x;} a; 

  在某些机器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。 

  这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被4整除的地址。

struct里面需要对齐的,而整个struct也需要对齐到4个字节,所以21就对到24了

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我是个小女孩啊!学美发能有出路吗?
帮忙搜集非主流颓废叼烟女、和比心心女头、捂
在哪挖矿
火车可以托运吗,火车托运可否托运小车
唉~~现在的工作是早8晚8钱少!!怎么样可以找
洗1/3精煤成本如何核算?
优果鲜榨果汁这个地址在什么地方,我要处理点
肝功二的检查报告表怎么看?
辐射3怎么输秘籍 详细点~
CF鬼跳(不显版)
谁能指点两下DNF25级剑魂PK的连招套路啊?
DNF强装备该怎么才能提高成功率?
人为什么会生老病死呢?
手臂烧伤后伤口好了,但现在留下了很红的红印
求美剧英雄第二集全集
推荐资讯
诛仙2中JN什么意思
热舞派对`“幸运接力棒”怎么用的?
关于牛仔裤、穿几天、裤裆周围的部分就会磨破
我每次在百度搜索到的历史纪录在下拉框里总是
为什么我总是一个人…一下班就一个人闷在家里
天津血液研究所
例假期间,什么运动不可以作?
顺远这个牌子的电动车怎么样?
可以抱我吗
表示说的话不靠谱应该用什么成语或者名言
求初中生论文《春秋诸葛我评说》
急求一份自荐信?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?