关于结构体数据存储的对齐问题

发布者:bin0990最新更新时间:2015-05-04 来源: 51hei关键字:结构体  数据存储  对齐问题 手机看文章 扫描二维码
随时随地手机看文章
在C/C 中经常需要进行存储器的操作,关于数据如何在存储器中存储的问题也是非常重要的,如何在保证数据量(信息量)的同时又保证数据的存储量最小,乍一听感觉没什么好讨论的。但是作为学习嵌入式的必须要明白数据的存储是与数据的结构存在密切联系的,特别是结构体中的内存分配问题。
 
首先应该明白基本的类型在内存中的大小,char型一般占有1个字节,int型一般占有4个字节,double型一般占有8个字节,short 则占有2个字节(当然也会存在一定的变化,具体情况依据编译器决定)。我们都知道C语言的结构体是一个不同类型数据的集合。那么一个结构体到底占多少存储空间呢?
 
首先应该意识到C语言的存储存在一定的特殊性。在C语言的结构体中需要主要的是数据存储的对齐方式。对齐主要是为了方便数据的访问,提高计算机的处理速度,但是对齐会导致内存空间的浪费,这些浪费对于大内存空间的设备而言,没什么必要,但是对于嵌入式系统而言会造成大量的浪费。
 
在32bits的系统中对一个寄存器(32bits)的访问直接访问,但是对于寄存器中某一个字节的访问反而觉得很不方便,因此如果只是单个字节的访问反而增加了系统的负担。对一个寄存器的访问可以通过一个起始地址来实现,但是我们在很多CPU的用户手册中都会发现,寄存器的起始地址都能被4整除,这就是为了提高计算速度而采取的一些默认的方式。一个寄存器一般而言占有4个bytes,那么对下一个寄存器的访问只需要在原来的地址基础上加上4个 bytes即可。
 
对齐的基本作用就是提高系统的功能,特别是访问存储器的能力得到提高。
 
对齐在使用中有较多的意义。基本的使用原则:
1、对齐是为了提高系统的访问速度,一般基本的对齐原则是按着最大的基本类型的长度进行对齐,较小的元素可以几个组合起来填充一段对齐内存,实现基本的对齐,但是需要满足条件2。
2、结构体中的元素也要满足一定的分布条件,就是元素的存储起始地址要满足能够整除该元素类型的长度。
3、在结构体中存在结构体的情况下,也只是按着结构体中最大的基本类型长度对齐(包含内部结构体中的最大基本类型长度)。
 
在不同的编译器之间也存在一定的差别。在linux中最大的对齐长度是 4个字节,也就是如果结构体中的最大的基本类型长度是大于4的,那么也按着4对齐,同时不会按着结构体中最大的基本类型的长度对齐,伴随着最大基本类型元素的起始地址也不再满足能够被最大元素类型长度对齐的原则,而是满足整除4即可。但如果结构体中最大的基本类型长度小于4,那么按着最大的基本类型长度对齐
但是在windows中基本上都是按着最大的基本类型长度进行对齐,和一般的原则相似。
 
这边只是我的一些理解其中具体的要具体分析,在实际中建议将最大基本类型的元素放在开始的地方,然后将其他的数据按着一定的规律(能否组合起来满足对齐条件等)定义结构体,这个规律要根据实际情况分析。
 
下面通过基本的代码进行演示:
  1. #include
  2. #include
     

  3.  
  4. struct aa{
     
  5.     char a;
     
  6.     double b;
     
  7.     short c;
     
  8. };
     

  9.  
  10. struct bb
     
  11. {
     
  12.     double a;
     
  13.     short b;
     
  14.     char c;
     
  15. };
     

  16.  
  17. struct cc
     
  18. {
     
  19.     struct bb s1;
     
  20.     char s2;
     
  21. };
     

  22.  
  23. struct dd
     
  24. {
     
  25.     struct aa s1;
     
  26.     char s2;
     
  27. };
     

  28.  
  29. #pragma pack(1)
     
  30. struct ee
     
  31. {
     
  32.     double a;
     
  33.     short b;
     
  34.     char c;
     
  35. };
     

  36.  
  37. struct ff
     
  38. {
     
  39.     char a;
     
  40.     double b;
     
  41.     short c;
     
  42. };
     
  43. #pragma pack()
     

  44.  
  45. struct gg
     
  46. {
     
  47.     char a;
     
  48. };
     

  49.  
  50. struct jj
     
  51. {
     
  52.     char a;
     
  53.     short b;
     
  54. };
     

  55.  
  56. int main()
     
  57. {
     

  58.  
  59.     printf("double size is %d %d %d ",sizeof(double),sizeof(short),sizeof(char));
     
  60.     printf("size of s1 = %d size of s2 = %d ",sizeof(struct aa),sizeof(struct bb));
     

  61.  
  62.     printf("size of t1 = %d size of dd = %d ",sizeof(struct cc),sizeof(struct dd));
     
  63.     
     
  64.     printf("size of struct ee = %d size of struct ff = %d size of struct gg = %d size of struct jj = %d ",
     
  65.         sizeof(struct ee),sizeof(struct ff),sizeof(struct gg),sizeof(struct jj));
     
  66.     exit(0);
     
  67. }[page]
在linux下的结果:
 
 
在windows下的结果:
 
 
在linux下的存储形式,其中黑色包围起来的才是我们的存储空间白色的部分是保留区域,通过下面的两幅图就可以知道其中的一些道理,知道其中所谓的完成一样的功能,保证存储空间最小:
 
 
在windows下的存储形式,其中黑色包围起来的才是我们的存储空间白色的部分是保留区域:
 
从上面的几个图片可以知道在C语言中的内存分布是比较复杂的。一定要注意存储的对齐形式,这样才能了解其中的分布规律。当然了上面的形式都只是在小端处理器模式下的存储形式,对于大端也有类似的情况,只是存储的位置不一样,但是内存的大小是相同的。
 
结构体的定义不能是随便的,如果考虑好对齐关系能够节省大量的存储空间。实现效率和存储空间的折中。虽然#pragma pack(n)等能够改变其中的对齐方式,不过建议不要随便改动,可能得不偿失。
关键字:结构体  数据存储  对齐问题 引用地址:关于结构体数据存储的对齐问题

上一篇:结构体中动态内存的管理(malloc和free)
下一篇:gcc的几个妙用

推荐阅读最新更新时间:2024-03-16 14:00

SRAM外部数据存储器扩展实验
一、实验目的 1.掌握 89C51单片机扩展外RAM的方法 2.了解静态 RAM使用方法   二、实验说明 MCS-51型单片机内有 128B的RAM,只能存放少量数据,对一般小型系统和无需存放大量数据的系统已能满足要求。对于大型应用系统和需要存放大量数据的系统,则需要进行片外扩展RAM。 MCS-51型单片机在片外扩展 RAM的地址空间为0000H~FFFFH共64KB。读写外RAM时用MOVX指令,用RD选通RAM OE端,用WR选能RAM WE端。 扩展外 RAM芯片一般采用静态RAM(SRAM),也可根据需要采用E2PROM芯片或其他RAM芯片。本实验使用SRAM 6264芯片进行片外RAM扩展
[单片机]
SRAM外部<font color='red'>数据存储</font>器扩展实验
透气阻水性测试仪原理方法分析
上海诚卫适用于测试直接接触创面的任何形状、形态或规格的创可贴、绷带、医用胶带等材料的阻水性能。是各质检机构、研究机构及各大企业首选专业阻水性能测试仪。阻水性测试仪适用于测试直接接触创面的任何形状、形态或规格的创可贴、绷带、医用胶带等材料的阻水性能。是各质检机构、研究机构及各大企业首选专业阻水性能测试仪。 产品特征 7寸触控彩色触摸屏,微电脑控制 分级权限管理,数据统计及审计功能满足行业要求 内置微型打印机 具有数据存储功能,可以存储500组数据 全自动操作,自动抽水实验 测试标准 YY 0471.3《接触性创面辅料试验方法第三部分:阻水性》 指标参数 静 水 压 500 mm 开关控制 电磁阀 耐压时间 0 ~ 99.99 m
[测试测量]
智能化与物联网的大潮中,FRAM助力三表设计新突破
前些年随着一部轻喜剧的播出, 查水表 一词已被引申为调侃之语了。而伴随着智能化大潮的到来,这个曾与我们老百姓生活息息相关的词在日常生活中也正与我们渐行渐远,因为传统三表已经实现了智能计量和无线数据采集、数据实时存储和无线采集。作为其中的关键环节,数据存储的低功耗和可靠性越来越受到关注。在不久前闭幕的智能水/气计量产业链高峰论坛(WATER & GAS METERING China2016)上,富士通电子元器件(上海)有限公司亚太区市场部总经理王钰针对三表数据存储发表了专题演讲。 作为三表中智能化走得较早的电表,其智能化普及程度远远领先于气表和水表,业界曾预测智能电表的普及率在2016年将超过90%。 富士通全球FRAM存储器销量
[物联网]
智能化与物联网的大潮中,FRAM助力三表设计新突破
ATmega64 SRAM数据存储
SRAM 数据存储器 ATmega64 支持两种配置的SRAM 数据存储器,见Table 1。 Figure 9 给出了ATmega64 SRAM 空间的组织结构。 ATmega64并行单元超过 64个,对于0x60 - 0xFF的扩展I/O空间,只能使用ST/STS/STD 与LD/LDS/LDD 指令。在ATmega103 兼容模式下,不存在扩展I/O 空间。 前4,352 个数据存储器包括了寄存器文件、I/O 存储器及内部数据SRAM。起始的32 个 地址为寄存器文件接着的64 个地址为标准I/O 存储器, 160 个扩展 I/O 存储器, 4,096 字节的内部数据SRAM。 ATmega103 兼容模式下
[单片机]
ATmega64 SRAM<font color='red'>数据存储</font>器
组成网络的基本单元无线传感器网络节点解析方案
无线传感器网络是新兴的研究领域,在军事、环境、健康、家庭、商业领域等许多方面有着巨大的潜在应用前景。无线传感器网络节点是组成网络的基本单元,无线传感器网络的迅速发展,给无线传感器网络节点的设计和管理提出了许多挑战。 无线传感器网络节点 无线传感器网络是集数据采集、处理及通信功能于一体的分布式自组织网络。无线传感器网络由在一定区域范围内的多个具有无线通信、传感、数据处理功能的网络节点组成。传感器节点负责采集、处理、压缩数据、中转其他节点的数据包并将数据包发送出去。在不同的应用中,传感器网络节点的结构不尽相同,一般由数据采集单元(传感器、A/D转换器)、数据处理和控制单元(微处理器、存储器)、无线通信单元(无线收发器)和供电单
[嵌入式]
采用FPGA与SRAM的大容量数据存储的设计
  1 前言   针对FPGA中内部BlockRAM有限的缺点,提出了将FPGA与外部SRAM相结合来改进设计的方法,并给出了部分VHDL程序。   2 硬件设计   这里将主要讨论以Xilinx公司的FPGA(XC2S600E-6fg456)和ISSI公司的SRAM(IS61LV25616AL)为主要器件来完成大容量数据存储的设计思路。   FPGA即现场可编程门阵列,其结构与传统的门阵列相似,大量的可编程逻辑块( CLB , Configurable Logic Block ) 在芯片中央按矩阵排列,芯片四周为可编程输入/输出块( IOB , Input / Output Block),CLB行列之间及CLB和IOB之
[单片机]
采用FPGA与SRAM的大容量<font color='red'>数据存储</font>的设计
基于MSP430F449单片机实现数据存储和通信系统的设计
在数据采集和测量仪器尤其是便携式设备中,数据存储和传输是不可避免的问题,近年来TI公司推出的低功耗微控制器MSP430,在仪器设计和制造领域引起巨大变革,新型控制器和大容量串行存储器的应用大大提高产品了的性能。本文主要解决两个问题 1、解决经过MSP430采集后的数据与EEPROM24C256的数据接口问题,也就是数据存储问题; 2、解决EEPROM与上位机(普通微机)的数据通信问题,也就是存储后的数据上传问题。 首先对主要的集成电路做简单介绍 MSP430F449简介 MSP430F449是MSP430系列中的一种,MSP430系列是一种具有集成度高,功能丰富、功耗低等特点的16位单片机。它的集成调试环境Embedd
[单片机]
基于MSP430F449单片机实现<font color='red'>数据存储</font>和通信系统的设计
基于虚拟存储的嵌入式存储系统的设计方法
1引言   嵌入式系统由嵌入式硬件和固化在硬件平台中的嵌入式软件组成。传统的小规模嵌入式系统,软件多采用前后台的方法,通常应用于实时性要求不高的简单场合;对于复杂的应用场合,较为普遍的做法是给系统配上嵌入式实时操作系统(RTOS),这样不仅能够使系统具有良好的实时性能,降低软件编制的工作量,还可以提高整个系统的稳定性。此外,为了简化用户程序,系统通常要提供一些必要的库函数供用户调用。同前后台系统相比,这种实时嵌入式系统增加了系统存储空间的开销。Intel 8051系列及各种兼容的单片机因其极高的性价比、丰富的库函数和长期的技术积累等背景而被广泛应用于各种嵌入式领域中。受传统单片机寻址空间的限制,嵌入式应用中经常需要进行存储空间
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved