1.sizeof操作符
sizeof是单目操作符而不是函数。操作数可以是一个表达式或者括在括号内的类型名,返回操作数占用存储空
间的字节数。
2.sizeof使用方法
(1)用于数据类型(必须用括号括住):sizeof(数据类型);如 sizeof(int)
(2)用于变量:sizeof(变量名) 或者 sizeof 变量名;
(3)不能用户函数类型、void类型等
3.sizeof用途
(1)与存储分配和I/O系统的例程进行通信。
如,用malloc()申请一块长度为length的整型数组的内存,代码如下:
int *p = (int*)malloc(sizeof(int) * length);
(2)计算数组中元素的个数,如,char str[] = "sdfefs"; int num = sizeof(str)/sizeof(str[0]);
4.sizeof与strlen有哪些区别
(1)sizeof是运算符,strlen是C语言的库函数;
(2)功能上,sizeof是求指定变量或变量类型所占用内存的大小;strlen用来求以'\0'结尾的字符串长度
(3)sizeof可以用类型做参数,strlen只能用char*做参数;
(4)计算指针指向的字符串的长度一定要使用strlen。
(5)使用示例如下
对于静态数组处理:
char str[20]="0123456789";
strlen(str)=10; //表示数组中字符串的长度
sizeof(str)=20; //表示数组变量分配的长度
对于指针处理:
char *str="0123456789";
strlen(str)=10; //表示字符串的长度
sizeof(str)=4; //表示指针变量的所占内存大小
sizeof(*str)=1; //表示'0'这个字符变量的所占内存大小
5.关于sizeof的计算
(1)计算普通变量所占内存
char str[] = "hello"; char *p = str; int = 10;
sizeof(str) = ?; //str表示数组,表示数组占用内存总空间,sizeof(str) = strlen(str) + 1
sizeof(p) = ?;
sizeof(n) = ?;
void Fun(char str[100])
{
sizeof(str) = ?;//数组是"传址"的,函数Fun在栈上分配4个字节的指针指向数组。
}
void *p = malloc(100); //在堆内存上指定100个字节
sizeof(p) = ?;
(2)计算类对象或者结构体所占内存
class A
{
public:
int i; int ii; int iii; char ch; char chr; short j;
}
struct S
{
char c1; int i; char c2;
}
sizeof(A) = 3*4 + 2*1 + 2 = 15; 但实际上sizeof(A) = 16;
sizeof(S) = 1 + 4 + 1 = 6; 但实际上sizeof(S) = 12;
三个标准:
a.类或者结构体变量的首地址能够被其最宽的基本类型成员的大小所整除;
b.类或者结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍;
c.类或者结构体总大小为其最宽的基本类型成员的整数倍;
(3)计算含有虚函数的类对象所占内存
普通函数不占用内存,只要虚函数会占用一个指针大小的内存,原因是系统用一个指针维护这个类的虚
函数表,并且无论有多少个虚函数都是这一个指针。
(4)计算虚拟继承的类对象所占内存
a.空类,编译器会安插一个char空类标记它的每一个对象,因此占1个字节的内存;
b.虚拟继承,编译器为该类安插一个指向父类的指针,如果此时类为空编译器也不会安插一个char了,
因此占用4个字节的内存,一个虚拟继承安插一个指针,多个虚拟继承则安插多个指向父类的指针。
c.含有静态成员变量的类,静态成员的空间不在类的实例中,而是像全局变量一样在静态存储区,计算
类对象占用内存大小时不用计算它。
(5)计算联合体所占内存
联合体的大小取决于它所有的成员中占用空间最大的一个成员的大小。
6.#pragma pack作用
#pragma pack(4) 表示4字节对齐。