1、sizeof使用如下:
#include <iostream> #include <cstdio> #include <stdio.h> #include <string.h> using namespace std; struct{ short a1; short a2; short a3; }A;//结构体对齐参数默认8字节,3个short类型,对齐字数2字节,总共为6 struct{ long a1; short a2; }B;//结构体对齐参数默认8字节,1个long8字节,1个short2字节,补齐16字节(64位操作系统) //结构体对齐参数默认8字节,1个long4字节,1个short2字节,补齐8字节(32位操作系统) int main() { char *ss1="0123456789";//ss1是一个指针,大小为定值4(32位操作系统)8(64位操作系统) char ss2[]="0123456789";//char 1位,总共10位,加上结束符' ',共11 char ss3[100]="0123456789";//预分配100位,字符1位,共100 int ss4[100];//预分配100位,int类型4位,共400 char q1[]="abc";//同上ss2,共4 char q2[]="a ";//' '1位,共3 char *q3="a ";//q3是一个指针,大小为定值4(32位操作系统)8(64位操作系统) char *str1=(char *)malloc(100);//str1是一个指针,大小为定值4(32位操作系统)8(64位操作系统) void *str2=(void *)malloc(100);//str2是一个指针,大小为定值4(32位操作系统)8(64位操作系统) cout<<sizeof(ss1)<<" "; cout<<sizeof(ss2)<<" "; cout<<sizeof(ss3)<<" "; cout<<sizeof(ss4)<<" "; cout<<sizeof(q1)<<" "; cout<<sizeof(q2)<<" "; cout<<sizeof(q3)<<" "; cout<<sizeof(A)<<" "; cout<<sizeof(B)<<" "; cout<<sizeof(str1)<<" "; cout<<sizeof(str2)<<" "<<endl; return 0; } #include <iostream> #include <cstdio> #include <stdio.h> #include <string.h> using namespace std; class A{};//空类,默认1个字节 class B{char d,e;};//两个char类型,2个字节 struct C{};//空结构体,默认1个字节 struct D{char b,c;};//两个char类型,2个字节 struct E{int x,y;};//两个int类型,8个字节 class F{F();~F();};//空类,1字节 class G{//sizeof计算栈中分配大小,是不会计算静态变量的全局数据区域,所以4+1字节,对齐8字节 G(); ~G(); struct{int a;char c;}; public: static int b;//不计算 }; class H{//同上4+1+4+4,对齐16字节 H(); ~H(); struct{int a;char c;}; public: static int b;//不计算 int e; private: int f; }; int main() { cout<<sizeof(A)<<" "; cout<<sizeof(B)<<" "; cout<<sizeof(C)<<" "; cout<<sizeof(D)<<" "; cout<<sizeof(E)<<" "; A *p1=new A();//p1是一个指针,大小为定值4(32位操作系统)8(64位操作系统) A p2;//p2属于A的对象等同于A的大小,1字节 A *p3;//p1是一个指针,大小为定值4(32位操作系统)8(64位操作系统) B *p11=new B();//p1是一个指针,大小为定值4(32位操作系统)8(64位操作系统) B p22;////p2属于A的对象等同于A的大小,2字节 B *p33;//p1是一个指针,大小为定值4(32位操作系统)8(64位操作系统) cout<<sizeof(p1)<<" "; cout<<sizeof(p2)<<" "; cout<<sizeof(p3)<<" "; cout<<sizeof(p11)<<" "; cout<<sizeof(p22)<<" "; cout<<sizeof(p33)<<" "<<endl; cout<<sizeof(F)<< " "; cout<<sizeof(G)<< " "; cout<<sizeof(H)<< " "; return 0; } #include <iostream> #pragma pack(1)//1强制1个字节排列,2强制2个字节排列,下面输出6字节 using namespace std; struct A{ int a=1; char b='a'; }; int main() { cout << sizeof(A) << endl;//强制1个字节排列,不对其,也就是说5个字节 return 0; }
2、sizeof使用场合
(1)、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程通信。例如:
void *malloc(size_t __size); size_t fread(void *p,size_t __size,size_t n,FILE *s);
(2)、用它可以看看某种类型对象在内存中所占的单元字节。例如:
void *memset(void *s,int c,sizeof(s))
(3)、在动态分配一对象时,可以让系统知道要分配多少内存。
(4)、便于一些类型的扩充。在windows中有很多结构类型就有一个专用的字段用来存放该字节大小。
(5)、由于操作数的字节数在现实时可能出现变化,建议在涉及到操作数字节时用sizeof代替常亮计算。
(6)、如果操作数是函数中的数组形参数或函数类型的参数,sizeof给出其指针的大小。
3、sizeof与strlen两者的区别如下:
(1)、siezof操作符的结果类型是size_t,它在头文件typedef为unsigned int类型。该类型保证能容纳所建立的最大对象的字节大小。
(2)、sizeof是算符,strlen是函数。
(3)、siezof可以用类型做参数,strlen只能用char*做参数,且必须是一" "结尾的。sizeof还可以作为函数的参数,比如:
short f(); cout<<sizeof(f())<<endl;输出为2
(4)、数组做sizeof的参数不退化,传递给strlen就退化为指针。
(5)、大部分编程程序的时候就把sizeof计算过来,是类型或者变量的长度。这就是sizeof(x)可以用来定义数组唯独的原因:
char str[20]="0123456789"; int a=strlen(str);//a=10 int b=sizeof(str);//b=20
(6)、strlen的结果要在运行之后才能计算出来,用来计算字符串的长度,而不是类型占内存的大小。
(7)、sizeof后如果是类型必须加括号,如果是变量名可以不加括号。这是因为sizeof是个操作符而不是个函数。
cout<<sizeof 1<<endl;
(8)、当使用了一个结构体类型或变量是,sizeof返回实际的大小。当使用静态空间的数组时,sizeof返回全部数组的尺寸。sizeof操作符不能返回被动态分配的数组或外部的数组的尺寸。
struct x { static double s;//sizeof计算栈中分配大小,是不会计算静态变量的全局数据区域 int *p = (int*)malloc(100 *sizeof(int));//动态分配数组,计算指针长度,8字节 int *p1=new int[100];//动态分配数组,计算指针长度8字节 };
(9)、数组作为参数传给指针的是指正而不是数组,传递的是数组的首地址,如:f(char[8])、f(char[])都等价于f(char*)。在c++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小。如果想在函数内知道数组的大小,需要这样做:
进入函数后用memcpy将数组拷贝出来,长度由另一个形态传进去。代码如下:
fun(unsiged char *p1,int len) { unsigned char* buf=new unsigned char(len+1); memcpy (buf,p1,len); }
(10)、C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这叫数据对齐,这样可能会浪费内存,但在理论上CPU速度快乐。设置#pragma pack(n)的设定可改变对齐规则。
(11)、sizeof操作符不能用于函数类型、不完全类型或位字段。不完全类型指具有未知存储大小数据的类型数据,如未知存储大小的数组类型,未知内容的结构或联合类型、void 类型等。