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 }

测试结果

时间: 2024-11-15 12:07:19

C或C++中struct内存对齐计算精简方案的相关文章

struct内存对齐1:gcc与VC的差别

struct内存对齐:gcc与VC的差别 内存对齐是编译器为了便于CPU快速访问而采用的一项技术,对于不同的编译器有不同的处理方法. Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则: 任何基本数据类型T的对齐模数就是T的大小,即sizeof(T).比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始.Linux下的GCC奉行的是另外一套规则:任何2字节大小(包括单字节吗?)的数据类型(比如short)的对齐模

【C语言】结构体中的内存对齐问题

话说大家有没有发现结构体中的内存对齐问题很有意思呢?我们这一次就一起研究一下这个问题为什么值得人探讨. 结构体内存对齐有三个原则; 1.数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储). 2.结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有s

20160402_C++中的内存对齐

原题: 有一个如下的结构体: struct A{  long a1;  short a2;  int a3;  int *a4; }; 请问在64位编译器下用sizeof(struct A)计算出的大小是多少? 答案:24 -------------------------------------------------------------------------------- 本题知识点:C/C++ 预备知识:基本类型占用字节 在32位操作系统和64位操作系统上,基本数据类型分别占多少字节

C++中的内存对齐

内存对齐 在我们的程序中,数据结构还有变量等等都需要占有内存,在很多系统中,它都要求内存分配的时候要对齐,这样做的好处就是可以提高访问内存的速度. 我们还是先来看一段简单的程序: 程序一 #include <iostream> 2 using namespace std; 3  4 struct X1 5 { 6   int i;//4个字节 7   char c1;//1个字节 8   char c2;//1个字节 9 };10 11 struct X212 {13   char c1;//

C/C++中的内存对齐问题和pragma pack命令详解

这个内存对齐问题,居然影响到了sizeof(struct)的结果值.突然想到了之前写的一个API库里,有个API是向后台服务程序发送socket请求.其中的socket数据包是一个结构体.在发送socket之前,会检测数据的长度:服务端接收到数据后也会检测长度.如果说内存对齐问题影响到了结构体的sizeof,那么socket发送结构体的时候,是怎么发送的?发送的内容中是否包含结构体中的“空洞”?如果API库中的对齐方式没有设定,那么服务端和客户端的sizeof结果将不同,这会引起很多问题吗? 下

C/C++中的内存对齐 C/C++中的内存对齐

一.什么是内存对齐.为什么需要内存对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 字,双字,和四字在自然边界上不需要在内存中对齐.(对字,双字,和四字来说,自然边界分别是偶数地址,可以被4整除的地址,和可以被8整除的地址.)无论如何,为了提高程序的性能,数据结构(尤其是栈)应该尽可能

struct内存对齐

内存对齐其实是为了在程序运行的时候更快的查找内存而做的一种编译器优化. 我们先看这样一个例子: 1 #include <iostream> 2 using namespace std; 3 4 struct vpoet 5 { 6 int a; //4 bytes 7 char b; //1 bytes 8 double c; // 8 bytes 9 char *d; //4 bytes 10 int e; //4 bytes 11 }; 12 13 int main() 14 { 15 c

Delphi中的内存对齐 与 Packed关键字

以delphi为例:TTest = recordc1: char;i1: Integer;c2: char;c3: Char;end;这个结构如果用sizeof取其占用的内存大小,是多少呢,是1+4+1+1=7么,不是,是4*3 = 12; 这是因为32位编译的时候,默认结构会自动内存对齐(32bit = 4byte). 如果要想让这个结构占用7个字节的话,必须加上packed关键字.如下:TTest = packed recordc1: char;i1: Integer;c2: char;c3

C语言中的内存对齐

由下面的测试代码可以总结出两点:(1)内存对齐是针对结构体而言的    (2)编译时char类型的申请的空间由其后面的数据类型决定. #include<stdio.h> enum Season { Spring,Summer,Autumn }; enum ENUM Enum = Autumn; union UNION { int a; char b; double c; }; union UNION Union; struct STRUCT { char b; //4字节 int a; //4