C或C++中struct内存对齐计算精简方案

      struct占用内存计算方法:

      假设struct的起始地址是0x00000000,则从起始地址开始到当前元素为止所占用的空间“和”,必须是下一个成员空间的整数倍(未达到整数倍的部分留空),当到达最后一个成员的时候,即要计算总struct空间的时候,这个空间必须是所有成员中最大基本元素的整数倍。

  如果struct的某一个元素是数组,只需对齐到基本元素即可,不用对齐整个数组 

  所以,定义结构体的时候,尽量将同一类型的变量声明在一起,而且按照占用空间大小,使用由大到小排列的方式,例如占用内存大的成员放在靠前的位置,这样能够有效节省内存。

     网上计算struct占用内存空间的规则太复杂,这个就简单很多,只关注当前成员即可。

 

测试代码

  1 // CUITestingCPP.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include <iostream>
  6 using namespace std;
  7 
  8 struct MyStruct
  9 {
 10     bool mem_1;
 11     double mem_2;
 12     bool mem_3;
 13     int mem_4;
 14     short mem_5;
 15     int mem_6;
 16     short mem_7;
 17     double mem_8;
 18 };
 19 
 20 struct test1
 21 {
 22     int mem_1;
 23     bool mem_2;
 24     int mem_3;
 25     bool mem_4;
 26     float mem_5;
 27 };
 28 
 29 struct st2{
 30     char mem_1;
 31     char mem_2;
 32     int mem_3;
 33     short mem_4;
 34 };
 35 
 36 struct stx{
 37     char mem_1;
 38     short mem_2;
 39     char mem_3;
 40     int mem_4;
 41 };
 42 
 43 struct st1{
 44     int mem_1;
 45     char mem_2;
 46     short mem_3;
 47 };
 48 
 49 struct stu1
 50 {
 51     int mem_1;
 52     char mem_2;
 53     int mem_3;
 54 };
 55 
 56 struct stu3
 57 {
 58     char mem_1;
 59     int mem_2;
 60     char mem_3;
 61 };
 62 
 63 struct stu4
 64 {
 65     char mem_1;
 66     char mem_2;
 67     int mem_3; 
 68 };
 69 
 70 struct sty{
 71     short mem_1;
 72     char mem_2;
 73     int mem_3;
 74 };
 75 
 76 struct ste{
 77     char mem_1;
 78 };
 79 
 80 struct steFin{
 81     short mem_1;
 82     char mem_2;
 83     short mem_3;
 84 };
 85 
 86 int _tmain(int argc, _TCHAR* argv[])
 87 {
 88     MyStruct test_Struct;
 89     size_t size = sizeof(test_Struct);
 90 
 91     int size_Mem[8];
 92     size_Mem[0] = (int)(&test_Struct.mem_1);
 93     size_Mem[1] = (int)(&test_Struct.mem_2);
 94     size_Mem[2] = (int)(&test_Struct.mem_3);
 95     size_Mem[3] = (int)(&test_Struct.mem_4);
 96     size_Mem[4] = (int)(&test_Struct.mem_5);
 97     size_Mem[5] = (int)(&test_Struct.mem_6);
 98     size_Mem[6] = (int)(&test_Struct.mem_7);
 99     size_Mem[7] = (int)(&test_Struct.mem_8); 
100 
101     int addUp = 0;
102 
103     cout << "各成员占用空间大小" << endl;
104     int arr_size = sizeof(size_Mem) / sizeof(size_Mem[0]);
105     for (int i = 1; i <arr_size; ++i)
106     {
107         addUp += size_Mem[i] - size_Mem[i - 1];
108         cout << size_Mem[i] - size_Mem[i - 1];
109         if (i == arr_size - 1)
110         {
111             cout << " 目前占用字节数为";
112             cout << addUp;
113         }
114 
115         cout << endl;
116     }
117 
118     cout << size - addUp << endl;
119     cout << endl << "总大小" << endl << size << endl;
120 
121     system("pause");
122 
123     return 0;
124 }

 

测试结果

 

posted on 2015-05-15 15:56  毋忆典藏  阅读(1070)  评论(0编辑  收藏  举报