说明:以下例题结果均是在32位平台VC6.0环境得到的。
一、sizeof应用于基本数据类型
1、sizeof应用于指针
char *str = "0123456789"; char *str = (char *)malloc(100); void *str = (void *)malloc(100);
解析:sizeof(str) = 4。32位CPU指针占4个字节。
2、sizeof应用于数组
char ss1[] = "0123456789"; char ss2[100] = "0123456789"; char q[] = "a\n"; int ss3[100]; int *p = ss3;解析:
(1)sizeof(ss1) = 11,即sizeof(ss1) = 11 * sizeof(char) = 11,注意字符数组编译器自动在末尾填充“\0”。
(2)sizeof(ss2) = 100。
(3)sizeof(q) = 3。
(4)sizeof(ss3) = 400,即sizeof(ss3) = 100 * sizeof(int)= 400。
(5)sizeof(ss3) /sizeof(*ss3) = 100,实际上*ss3为数组中第一个元素占用的内存,为4个字节。
(6)sizeof(p) / sizeof(*p) = 1。指针p占用的内存显然为4个字节,而*p为数组中第一个元素同样占用4个字节。
二、sizeof应用于复合数据类型
1、结构中有普通成员和位域成员。例如:
struct DateTime_1 { unsigned int year; unsigned int month : 4; unsigned int day : 5; unsigned int hour : 5; unsigned int minute : 6; unsigned int second : 6; };
解析:sizeof(DateTime_1) =8。因为sizeof(unsigned int) = 4,所以结构以4个字节对齐,位域成员占26个bit,将填充为4个字节。
2、结构中有长度为0的位域成员。例如:
struct DateTime_2 { unsigned int day : 5; unsigned int : 0; unsigned int minute : 5; };
解析:sizeof(DateTime_2) =8。长度为0的位域成员的作用是:使下一个成员从下一个完整的机器字开始分配空间。结构以4个字节对齐,day的位置是第一个4个字节的前5个bit,minute的位置是第二个4个字节的前5个bit。
3、结构中嵌套数组。例如:
struct X { bool m_ch; double m_width; char m_name[10]; };
解析:sizeof(X) = 32。因为sizeof(double) = 8,所以结构以8个字节对齐,结构中的数组成员在内存中仍然连续存放。
4、结构中嵌套结构。例如:
struct X { bool m_ch; double m_width; char m_name[10]; }; struct Y { int m_no; struct X m_y; };
解析:sizeof(Y) = 40。因为X是以8字节对齐的结构,sizeof(int) = 4,所以结构Y以8字节对齐。
5、结构中嵌套枚举。例如:
enum Color{RED = 0X01, BLUE, GREEN, YELLOW, BLACK}; struct sedan { bool x1; Color x2; bool x3; double x4; unsigned int x5; };
解析:sizeof(sedan) = 32。在标准C中,枚举类型的内存大小等于sizeof(int)。结构是以8个字节对齐的。
6、结构中嵌套联合。例如:
union R { int x; char y[10]; double z; }; struct D { bool m_ch; double m_width; char m_name[10]; R r; };
解析:sizeof(D) = 48。联合R以8字节对齐,最长的是数组y,所以sizeof(R) = 16。结构D以8字节对齐。
7、结构中有静态变量。例如:
class C { private: int a; static int b; C(); ~C(); };
解析:sizeof(C) = 4。注意静态变量是存放在全局数据区的,而sizeof计算栈中分配的大小。
原文地址:http://blog.csdn.net/mengwang024/article/details/40156163