资讯详情

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

在C/C 中经常需要进行存储器的操作,关于数据如何在存储器中存储的问题也是非常重要的,如何在保证数据量(信息量)的同时又保证数据的存储量最小,乍一听感觉没什么好讨论的。但是作为学习嵌入式的必须要明白数据的存储是与数据的结构存在密切联系的,特别是结构体中的内存分配问题。 首先应该明白基本的类型在内存中的大小,char型一般占有1个字节,int型一般占有4个字节,double型一般占有8个字节,short 则占有2个字节(当然也会存在一定的变化,具体情况依据编译器决定)。我们都知道C语言的结构体是一个不同类型数据的集合。那么一个结构体到底占多少存储空间呢? 首先应该意识到C语言的存储存在一定的特殊性。在C语言的结构体中需要主要的是数据存储的对齐方式。对齐主要是为了方便数据的访问,提高计算机的处理速度,但是对齐会导致内存空间的浪费,这些浪费对于大内存空间的设备而言,没什么必要,但是对于嵌入式系统而言会造成大量的浪费。 在32bits的系统中对一个寄存器(32bits)的访问直接访问,但是对于寄存器中某一个字节的访问反而觉得很不方便,因此如果只是单个字节的访问反而增加了系统的负担。对一个寄存器的访问可以通过一个起始地址来实现,但是我们在很多 的用户手册中都会发现,寄存器的起始地址都能被4整除,这就是为了提高计算速度而采取的一些默认的方式。一个寄存器一般而言占有4个bytes,那么对下一个寄存器的访问只需要在原来的地址基础上加上4个 bytes即可。 对齐的基本作用就是提高系统的功能,特别是访问存储器的能力得到提高。 对齐在使用中有较多的意义。基本的使用原则: 下面通过基本的代码进行演示:
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct aa{
  4. char a;
  5. double b;
  6. short c;
  7. };
  8. struct bb
  9. {
  10. double a;
  11. short b;
  12. char c;
  13. };
  14. struct cc
  15. {
  16. struct bb s1;
  17. char s2;
  18. };
  19. struct dd
  20. {
  21. struct aa s1;
  22. char s2;
  23. };
  24. #pragma pack(1)
  25. struct ee
  26. {
  27. double a;
  28. short b;
  29. char c;
  30. };
  31. struct ff
  32. {
  33. char a;
  34. double b;
  35. short c;
  36. };
  37. #pragma pack()
  38. struct gg
  39. {
  40. char a;
  41. };
  42. struct jj
  43. {
  44. char a;
  45. short b;
  46. };
  47. int main()
  48. {
  49. printf("double size is %d %d %d\n",sizeof(double),sizeof(short),sizeof(char));
  50. printf("size of s1 = %d\nsize of s2 = %d\n",sizeof(struct aa),sizeof(struct bb));
  51. printf("size of t1 = %d\nsize of dd = %d\n",sizeof(struct cc),sizeof(struct dd));
  52. printf("size of struct ee = %d\nsize of struct ff = %d\nsize of struct gg = %d\nsize of struct jj = %d\n",
  53. sizeof(struct ee),sizeof(struct ff),sizeof(struct gg),sizeof(struct jj));
  54. exit(0);
  55. }
在linux下的结果:
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台