C语言与C++结构体大小计算时区别,包括嵌套结构体大小的计算

C语言与C++结构体大小计算时区别
  • C语言
    • 在嵌套的结构体中,结构体内部的作用域是全局的,即内部的结构体成员变量命名不能出现重名现象,不然编译器会报错。并且两个有嵌套的结构体内部结构体命名也不能出现重名,如A和E。
    • 嵌套的结构体大小计算时应该考虑到内部结构体的大小,并不是简单的内部和外部相加。
    • 嵌套的结构体中,无论内部结构体是否声明相应的结构体变量,所占大小都相同,如A和E。

以下为main.c文件,结构体A的整体大小在默认对齐数为8时,大小为40,内层结构体B的大小为24,如果是只考虑内外成员变量的结果相加的话,外部成员变量大小应该为16。但是结构体C的成员变量类型和顺序与结构体A的成员变量相同,大小却为12,说明嵌套的结构体大小并不是简单的相加,还要考虑所有变量类型最大者。

#include 
//#pragma pack(4)

struct A
{
	char a;
	int b;
	int c;
	struct B
	{
		char d;
		double e;
		double f;
	}B;
}A;
struct E
{
	char a;
	int b;
	int c;
	struct F
	{
		char d;
		double e;
		double f;
	};
}E;

struct C
{
	char a;
	int b;
	int c;
}C;

struct D
{
	char a;
	int b;
	int d;
};

void main()
{
	printf("%d\n", sizeof(A));//40,对齐数为4时,结果为32
	printf("%d\n", sizeof(A.B));//24,对齐数为4时,结果为20
	printf("%d\n", sizeof(C));//12,对齐数为4时,结果为12
    printf("%d\n", sizeof(struct D));//12,对齐数为4时,结果为12
}
  • C++

    • 在嵌套的结构体中,结构体内部的作用域仅包含当前层,即使内部结构体与外部结构体成员变量重名也不影响。
    • 嵌套的结构体如果已经声明了结构体变量,则计算大小的方式相同,如果没有声明,则大小相当于没有内部的结构体。如A和E。

以下为main.cpp文件,通过J结构体A与结构体E的比较可以看出是否声明内部结构体变量对计算结构体大小的影响。

#include 
using namespace std;
//#pragma pack(4)
struct A
{
	char a;
	int b;
	int c;
	struct B
	{
		char a;
		double b;
		double c;
	}B;
}A;

struct E
{
	char a;
	int b;
	int c;
	struct B
	{
		char a;
		double b;
		double c;
	};
}E;

struct C
{
	char a;
	int b;
	int d;
}C;
struct D
{
	char a;
	int b;
	int d;
};
void main()
{
	cout << sizeof(A) << endl;//40,对齐数为4时,结果为32
	cout << sizeof(A.B) << endl;//24,对齐数为4时,结果为20
	cout << sizeof(C) << endl;//12,对齐数为4时,结果为12
	cout << sizeof(D) << endl;//12,对齐数为4时,结果为12
	cout << sizeof(E) << endl;//12,对齐数为4时,结果为12
	//cout << sizeof(E.B) << endl;//报错
}

你可能感兴趣的:(C/C++,c语言,c++)