zoukankan      html  css  js  c++  java
  • 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 }

    测试结果

  • 相关阅读:
    [ACM] hdu 1671 Phone List (特里)
    Android 记录的(MediaRecorder)而播放(MediaPlayer)
    菜鸟进阶Android Touch事件传递(四)
    九度oj题目&amp;吉大考研11年机试题全解
    怎样取消shutdown关机命令?-shutdown命令的使用解析
    怎样下载并编译Android4.0内核源代码goldfish(图文)
    三角函数图像
    HTML里面Textarea换行总结
    java中使用队列:java.util.Queue
    ContentProvider简单介绍
  • 原文地址:https://www.cnblogs.com/tingshuixuan2012/p/4505638.html
Copyright © 2011-2022 走看看