C语言与C++结构体大小计算时区别
- C语言
- 在嵌套的结构体中,结构体内部的作用域是全局的,即内部的结构体成员变量命名不能出现重名现象,不然编译器会报错。并且两个有嵌套的结构体内部结构体命名也不能出现重名,如A和E。
- 嵌套的结构体大小计算时应该考虑到内部结构体的大小,并不是简单的内部和外部相加。
- 嵌套的结构体中,无论内部结构体是否声明相应的结构体变量,所占大小都相同,如A和E。
以下为main.c文件,结构体A的整体大小在默认对齐数为8时,大小为40,内层结构体B的大小为24,如果是只考虑内外成员变量的结果相加的话,外部成员变量大小应该为16。但是结构体C的成员变量类型和顺序与结构体A的成员变量相同,大小却为12,说明嵌套的结构体大小并不是简单的相加,还要考虑所有变量类型最大者。
#include <stdio.h>
//#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 <iostream>
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;//报错
}