C/C++中结构体占用内存大小的计算方法

发布时间 2023-09-18 18:11:11作者: 好人~

两个值:

  • 对齐系数:一般为8个字节。#pragma pack(8)设置对齐系数为8。
  • 有效对齐值:假设结构体中最长的类型的长度为len,则有效对齐值=min(len,对齐系数)

计算规则:

  • 计算存放的位置:第一个成员放在位置0,后面的成员A存放的时候,会先计算size=min(A大小, 有效对齐值),A只放在size的整数倍的位置。
  • 结构体作为成员:size大小为结构体成员的有效对齐值。
  • 结构体的总大小,必须是其有效对齐值的整数倍,不足的要补齐。

内存对齐的目的是为了内存对齐,减少访存操作。

#include <stdio.h>
#pragma pack(8)
int main()
{
	struct Test
	{
		int a;
		//long double大小为16bytes
		long double b;		     
		char c[10];
	};
	printf("%d", sizeof(Test));  // 8+8+8+10=34 34不是8的倍数,所以为40
	return 0;
} 
#include <stdio.h>
#pragma pack(16)
int main()
{
	struct Test
	{
		int a;
		//long double大小为16bytes
		long double b;		     
		char c[10];
	};
	printf("%d", sizeof(Test)); // 16+16+10=42  42不是16的倍数,所以为48
	return 0;
}
#include <stdio.h>
int main()
{

    struct b
	{
        double y;
        char x;	     
		
	};
	struct a
	{
		int c;
        char x;	   
        b b1; 
		
	};
	printf("%d", sizeof(a)); // 4+4+8+1 = 17 --> 24
	return 0;
} 
#include <stdio.h>
int main()
{
	typedef struct a
	{
		int c;
		double d;		     
		char b[10];
	}test;
	test  e;
	printf("%d", sizeof(test)); // 32
	return 0;
} 
#include <stdio.h>
int main()
{
	typedef struct a
	{
		double d;
		int c;		     
		char b[10];
	}test;
	test  e;
	printf("%d", sizeof(test)); // 24
	return 0;
}