C++内存对齐

本文详细阐述了C++中结构体数据成员的对齐规则,并通过实例展示了如何应用这些规则来计算结构体的大小。涵盖了结构体内部成员的对齐、结构体作为成员的对齐以及总大小的计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请牢记以下3条原则:(在没有#pragma pack宏的情况下)

1、数据成员对齐规则:结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,之后的每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机子上为4字节,所以要从4的整数倍地址开始存储)。

2、结构体作为成员:如果一个结构体里同时包含结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(如struct a里有struct b,b里有char,int ,double等元素,那么b应该从8(即double类型的大小)的整数倍开始存储)。

3、结构体的总大小:即sizeof的结果。在按之前的对齐原则计算出来的大小的基础上,必须还得是其内部最大成员的整数倍,不足的要补齐(如struct里最大为double,现在计算得到的已经是11,则总大小为16)。


#include <iostream>
using namespace std;
 
struct X1
{
  int i;//4个字节
  char c1;//1个字节
  char c2;//1个字节
 };

 struct X2 {
  char c1;//1个字节
  int i;//4个字节
  char c2;//1个字节
 };

struct X3
{
   char c1;//1个字节
   char c2;//1个字节
   int i;//4个字节
   static int t;
   static double t1;
 };

int X3:: t =0;
double X3:: t1 =0.0;
struct X4 {
	int a;  
	char b; 
	short c; 
	char d;  
};

struct inner  
{  
	char      c1;  
	double   d;  
	char     c2;  
};  

 int main()
 {   
    cout<<"long "<<sizeof(long)<<"\n";
	cout<<"long long"<<sizeof(long long)<<endl;
	cout<<"double"<<sizeof(double)<<endl;
    cout<<"int "<<sizeof(int)<<"\n";
    cout<<"char "<<sizeof(char)<<"\n";
 
    X1 x1;
    X2 x2;
    X3 x3;
	X4 x4;
    cout<<"x1 的大小 "<<sizeof(x1)<<"\n";
    cout<<"x2 的大小 "<<sizeof(x2)<<"\n";
    cout<<"x3 的大小 "<<sizeof(X3)<<"\n";
	cout<<"x4 的大小 "<<sizeof(x4)<<"\n";
	cout<<"inner 的大小 "<<sizeof(inner)<<"\n";
    return 0;
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值