#include <iostream>
struct POINTER
{
void* ptr;
};
struct A
{
char a;
};
struct B
{
char a;
char b;
};
struct C
{
char a;
int b;
long c;
};
struct C1
{
char a;
short d;
char f;
char e;
int b;
long c;
};
struct C2
{
int a;
char d;
int f;
char e;
int b;
long c; ///6*4
};
struct C3
{
char d;
char e;
int a;
int f;
int b;
long c; ///5*4
};
union MyUnion
{
long c;
int a;
char b[12];
};
struct D
{
long c;
char a;
int b;
};
struct E
{
char a;
long c;
int b;
};
struct F
{
char a;
long c;
char b;
};
struct G
{
char a;
long c;
F b;
};
struct H
{
char a;
char b;
short c;
};
struct I
{
char a;
char b;
int c;
};
struct EMPTY_CLASS
{
};
struct EMPTY_CLASS_WITH_VIRTUAL
{
virtual ~EMPTY_CLASS_WITH_VIRTUAL() {}
};
#define CALC_STRUCT_SIZE(T) \
std::cout <<"size of type " << #T << " is " << sizeof(T) << std::endl;
int main(int argc, char** argv)
{
CALC_STRUCT_SIZE(A);
CALC_STRUCT_SIZE(B);
CALC_STRUCT_SIZE(C);
CALC_STRUCT_SIZE(C1);
CALC_STRUCT_SIZE(C2);
CALC_STRUCT_SIZE(C3); //save memory than C2
CALC_STRUCT_SIZE(MyUnion);
CALC_STRUCT_SIZE(D);
CALC_STRUCT_SIZE(E);
CALC_STRUCT_SIZE(F);
CALC_STRUCT_SIZE(G);
CALC_STRUCT_SIZE(H);
CALC_STRUCT_SIZE(I);
CALC_STRUCT_SIZE(EMPTY_CLASS);
CALC_STRUCT_SIZE(EMPTY_CLASS_WITH_VIRTUAL);
CALC_STRUCT_SIZE(char*);
CALC_STRUCT_SIZE(short*);
CALC_STRUCT_SIZE(int*);
CALC_STRUCT_SIZE(long*);
CALC_STRUCT_SIZE(void*);
CALC_STRUCT_SIZE(F*);
CALC_STRUCT_SIZE(POINTER);
return 0;
}
注意在64为系统中,指针地址的大小是long long型,8个字节
而long型数据的字节数是需要注意的,简单而言可以看以下表格
因为我测试上述例子是在win64下,所以long是4个字节,如果在liunx下,那就是 8个字节了
参考: