后台开发:核心技术与应用实践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。

相关文章
|
5月前
|
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
78 6
如何使用内存监控工具来定位和解决Node.js应用中的性能问题?
总之,利用内存监控工具结合代码分析和业务理解,能够逐步定位和解决 Node.js 应用中的性能问题,提高应用的运行效率和稳定性。需要耐心和细致地进行排查和优化,不断提升应用的性能表现。
240 77
|
5月前
|
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
167 62
如何使用内存监控工具来优化 Node.js 应用的性能
需要注意的是,不同的内存监控工具可能具有不同的功能和特点,在使用时需要根据具体工具的要求和操作指南进行正确使用和分析。
111 31
网站应用项目如何选择阿里云服务器实例规格+内存+CPU+带宽+操作系统等配置
对于使用阿里云服务器的搭建网站的用户来说,面对众多可选的实例规格和配置选项,我们应该如何做出最佳选择,以最大化业务效益并控制成本,成为大家比较关注的问题,如果实例、内存、CPU、带宽等配置选择不合适,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文将详细解析企业在搭建网站应用项目时选购阿里云服务器应考虑的一些因素,以供参考。
Java内存模型的深入理解与实践
本文旨在深入探讨Java内存模型(JMM)的核心概念,包括原子性、可见性和有序性,并通过实例代码分析这些特性在实际编程中的应用。我们将从理论到实践,逐步揭示JMM在多线程编程中的重要性和复杂性,帮助读者构建更加健壮的并发程序。
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
115 1
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
131 29
JVM简介—1.Java内存区域
JVM实战—2.JVM内存设置与对象分配流转
本文详细介绍了JVM内存管理的相关知识,包括:JVM内存划分原理、对象分配与流转、线上系统JVM内存设置、JVM参数优化、问题汇总。
JVM实战—2.JVM内存设置与对象分配流转