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 }
测试结果:
‖==========钟于原创 乐于分享 宁静致远 毋忆典藏==========‖