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 }
测试结果:
原文链接: https://www.cnblogs.com/tingshuixuan2012/p/4505638.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/216163
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!