以代码为例子:
#include <iostream>
using namespace std;
int main()
{
//32位和64位系统在Windows下基本数据类型的大小都是一样的。
//只有指针的大小不一样!32位指针大小为4byte,而64位的指针大小为8byte。
cout << "****************64位****************" << endl;
cout << " " << endl;
cout << "****************基本数据类型的长度****************" << endl;
cout << "sizeof(char):" << sizeof(char) << endl;//1
cout << "sizeof(short):" << sizeof(short) << endl;//2
cout << "sizeof(int):" << sizeof(int) << endl;//4
cout << "sizeof(long):" << sizeof(long) << endl;//4
cout << "sizeof(long long):" << sizeof(long long) << endl;//8
cout << "sizeof(unsigned int):" << sizeof(unsigned int) << endl;//4
cout << "sizeof(float):" << sizeof(float) << endl;//4
cout << "sizeof(double):" << sizeof(double) << endl;//8
cout << " " << endl;
cout << "****************指针的数据长度****************" << endl;
void* pointer;
cout << "sizeof(pointer):" << sizeof(pointer) << endl;//32 - 4 64 - 8
struct Student{ //声明一个结构体类型Student
int num; //声明一个整形变量num
char name[20]; //声明一个字符型数组name
char sex; //声明一个字符型变量sex
int age; //声明一个整形变量age
float score; //声明一个单精度型变量
char addr[30]; //声明一个字符型数组addr
};
cout << " " << endl;
cout << "****************结构体的长度****************" << endl;
//在结构中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和(空结构除外,同时不考虑边界调整)。
Student student1;// 定义结构体类型变量student1
cout << "sizeof(Student):" << sizeof(Student) << endl;//68
cout << "sizeof(student1):" << sizeof(student1) << endl;//68
cout << "sizeof(student1.num):" << sizeof(student1.num) << endl;//4
cout << "sizeof(student1.name):" << sizeof(student1.name) << endl;//20
cout << "sizeof(student1.sex):" << sizeof(student1.sex) << endl;//1
cout << "sizeof(student1.age):" << sizeof(student1.age) << endl;//4
cout << "sizeof(student1.score):" << sizeof(student1.score) << endl;//4
cout << "sizeof(student1.addr):" << sizeof(student1.addr) << endl;//30
cout << " " << endl;
cout << "****************union的长度****************" << endl;
union U1 {
int a;
char b;
int c[8];
char d[5];
char *p1;
int *p2;
void *p3;
};
U1 u1;
//在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。
//应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内,
//而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。
cout << "sizeof(U1):" << sizeof(U1) << endl;//32
cout << "sizeof(u1.a):" << sizeof(u1.a) << endl;//4
cout << "sizeof(u1.b):" << sizeof(u1.b) << endl;//1
cout << "sizeof(u1.c):" << sizeof(u1.c) << endl;//32
cout << "sizeof(u1.d):" << sizeof(u1.d) << endl;//5
cout << "sizeof(u1.p1):" << sizeof(u1.p1) << endl;//32 - 4 64 - 8
cout << "sizeof(u1.p2):" << sizeof(u1.p2) << endl;//32 - 4 64 - 8
cout << "sizeof(u1.p3):" << sizeof(u1.p3) << endl;//32 - 4 64 - 8
cout << "****************其他****************" << endl;
int arr[10];
int *p1 = arr;
cout << "sizeof(p1):" << sizeof(p1) << endl;//32 - 4 64 - 8
return 0;
}
实验结果:
32位编译器:
64位:
由此可见:指针的长度不同,32 - 4 ,64 - 8
struct 的长度为和
union的长度为:
1)大小足够容纳最大的成员;
2)大小能被其包含的所有基本数据类型的大小所整除。
例如:
union U2 {
int a;
char b;
char d[33] ;
void *p;
};
cout<< "sizeof(U2):"<<sizeof(U2)<<endl;//36
实验结果
32位:
sizeof(U2):36
64位:
sizeof(U2):40
结果分析:
32位:最大成员 char d[33],长度为33,其他成员的长度分别为4,1,4,因此U2的长度需>=33且能被1,4整除,因此结果为36。
32位:最大成员 char d[33],长度为33,其他成员的长度分别为4,1,8,因此U2的长度需>=33且能被1,4,8整除,因此结果为40。