后台开发:核心技术与应用实践1.6.2 结构体、共用体在内存单元占用字节数的计算...

1.6.2 结构体、共用体在内存单元占用字节数的计算


一般64位机器上各个数据类型所占的存储空间如下所述。

(1)char:8bit=1byte。

(2)short:16bit=2byte。

(3)int:32bit=4byte。

(4)long:64bit=8byte。

(5)float:32bit=4byte。

(6)double:64bit=8byte。

(7)long long:64bit=8byte。

其中,long类型在32位机器上只占4Byte,其他类型在32位机器和64位机器都是占同样的大小空间。先来看union占用内存单元字节数的计算方法。

【例1.14】 union的字节数计算。

#include<iostream>

using namespace std;

union A{

    int a[5];

    char b;

    double c;

};

int main(){

    cout<<sizeof(A)<<endl;

    return 0;

}

程序的执行结果是:

24

union中变量共用内存,应以最长的为准,可是例1.14的执行结果却不是预想的20(int a[5],5*4 =20Byte),这是因为在共用体内变量的默认内存对齐方式,必须以最长的double(8Byte)对齐,也就是说应该是sizeof(A)=24。所以将共用体中的int a[5]修改成int a[6]后,结果仍然不变;但如果将int a[5]修改成int a[7],结果就将变成32。

再来看struct的计算方法。

【例1.15】 struct的字节数计算。

#include<iostream>

using namespace std;

struct B{

    char a;

    double b;

    int c;

}test_struct_b;

int main(){

    cout<<sizeof(test_struct_b)<<endl;

    return 0;

}

程序的执行结果是:

24

这是因为char a的偏移量为0,占用1Byte;double b指的是下一个可用的地址的偏移量为1,不是sizeof(double)=8,需要补足7Byte才能使偏移量变为8;int c指的是下一个可用的地址的偏移量为16,是sizeof(int)=4的倍数,满足int的对齐方式。

故所有成员变量都分配了空间,空间总的大小为1+7+8+4=20,不是结构的节边界数(即结构中占用最大空间的类型所占用的字节数sizeof (double)=8)的倍数,所以需要填充4Byte,以满足结构的大小为sizeof(double)=8的倍数,即24。

再来看一个混合结构体的大小计算。

【例1.16】 一个混合结构体大小的计算。

#include<iostream>

using namespace std;

typedef union{

    long i;

    int k[5];

    char c;

} UDATE;

struct data{

    int cat;

    UDATE cow;

    double dog;

}too;

UDATE temp;

int main(){

    cout<<sizeof(struct data)+sizeof(temp)<<endl;

    return 0;

}

假设是测试机器是在64位机器上,那么程序的执行结果应该是多少?UDATE是一个union,作为变量公用空间。里面占用字节数最多的变量是int k[5],有20Byte,但它要与long类型的8Byte对齐,所以占用24Byte。所以sizeof(struct data)是24,temp是一个struct,每个变量分开占用空间.依次为int4+UDATE28+double8=40,40是4和8的公倍数,字节已对齐,故sizeof(temp)是40,所以结果是40+24=64。

后台开发核心技术应用实践 作者:徐晓鑫 著 出版日期:2016年08月06日 封面宣传语:腾讯云平台技术总监黄世飞、Facebook对外支付项目主程张子兴、微软软件工程师彭可竞、阿里巴巴资深算法工程师周乐、百度大数据高级测试工程师畅晋联袂推荐;围绕后台开发需要掌握的核心技术,从多个方面、多个角度进行了阐述,覆盖了该领域的几乎所有内容;充分抓住本质并结合实践,文字通俗易懂,可操作性强 出版书名:后台开发核心技术应用实践 作者:徐晓鑫 著 封底文字 专家评价 后台开发一个“历史悠久”的领域,同时也是一个沉淀深厚,高技术价值的领域。本书清晰、严谨、务实的风格显示出晓鑫对该领域知识的深刻理解。 ——张子兴 Facebook对外支付项目主程,美国加州MenloPark 每一位从事后台开发的专业人士都需要一本后台开发指南。对每一位想要认真从事该领域工作的人来说,本书是一本绝对必读的书籍。 ——彭可竞 微软软件工程师,美国华盛顿州Redmond 本书是作者多年后台开发、架构和研究的精华。书中用通俗的文字、详尽的示代码,结合实际工作中的案,讲述了后台开发方方面面的知识,内容丰富。对于从事后台开发的人员,这是一本很好的由浅入深的学习书籍。 ——周乐 阿里巴巴资深算法工程师,北京望京 使用C++语言进行后台开发有一定的门槛,本书可以很好地帮助你跨过这个“门槛”。 ——畅晋 百度大数据高级测试工程师,北京上地 前勒口 互联网网民日益剧增,各种应用层出不穷,各项技术更新不断。单是游戏行业,近几年就经历了从端游、页游到手游的巨大变迁,客户端更新迭代之快,始料未及。而后台开发中使用到的技术,却变化不是很大。让服务性能更高、处理能力更强、安全性更好,是后台开发工程师永恒的主题。 后台开发中用到的技术,深而广,需要读的“大部头”很多,光是Richard Stevens的APUE,UNP,TCP/IP详解就够读个半年以上。读者通过阅读本书,可以从实践出发,快速由浅入深地进入后台开发领域。在读完本书,有了实践的经验之后,再去阅读大师们的著作,会更有体会,更懂得如何欣赏。 读书的最高境界莫过于“把书读薄,把书读厚”。本书文字通俗易懂,让你更快地“读薄”,同时又涉及较多的核心知识点,顺着这些知识点,读着读着也发觉“读厚”了。 后勒口 徐晓鑫,腾讯资深软件研发工程师,先后在腾讯游戏之洛克王国、QQ会员、QQ秀等项目工作,精通后台开发各种技术,实战经验丰富。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值