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 }

 

测试结果

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

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

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

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

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

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

 

你可能感兴趣的:(struct)