当前位置:天才代写 > tutorial > C语言/C++ 教程 > 深入领略sizeof

深入领略sizeof

2017-11-04 08:00 星期六 所属: C语言/C++ 教程 浏览:416

副标题#e#

最近在论坛里总有人问关于sizeof的问题,而且本人对这个问题也一直没有获得很好的办理,索性本日对它来个较为具体的总结,同时团结strlen举办较量,假如能对各人有点点辅佐,这是我最大的欣慰了。

一、好首先看看sizeof和strlen在MSDN上的界说:

首先看一MSDN上如何对sizeof举办界说的:

sizeof Operator
sizeof expression
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type
(including aggregate types). This keyword returns a value of type size_t.
The expression is either an identifier or a type-cast expression (a type specifier enclosed in
parentheses).
When applied to a structure type or variable, sizeof returns the actual size, which may include
padding bytes inserted for alignment. When applied to a statically dimensioned array, sizeof
returns the size of the entire array. The sizeof operator cannot return the size of dynamically
allocated arrays or external arrays.

然后再看一下对strlen是如何界说的:

strlen
Get the length of a string.
Routine Required Header:
strlen <string.h>
size_t strlen( const char *string );
Parameter
string:Null-terminated string
Libraries
All versions of the C run-time libraries.
Return Value
Each of these functions returns the number of characters in string, excluding the terminal
NULL. No return value is reserved to indicate an error.
Remarks
Each of these functions returns the number of characters in string, not including the
terminating null character. wcslen is a wide-character version of strlen; the argument of
wcslen is a wide-character string. wcslen and strlen behave identically otherwise.


#p#副标题#e#

二、由几个例子说开去。

第一个例子:

char* ss = "0123456789";
sizeof(ss) 功效 4 ===》ss是指向字符串常量的字符指针
sizeof(*ss) 功效 1 ===》*ss是第一个字符
char ss[] = "0123456789";
sizeof(ss) 功效 11 ===》ss是数组,计较到\0位置,因此是10+1
sizeof(*ss) 功效 1 ===》*ss是第一个字符
char ss[100] = "0123456789";
sizeof(ss) 功效是100 ===》ss暗示在内存中的巨细 100×1
strlen(ss) 功效是10 ===》strlen是个函数内部实现是用一个轮回计较到\0为止之前
int ss[100] = "0123456789";
sizeof(ss) 功效 400 ===》ss暗示再内存中的巨细 100×4
strlen(ss) 错误 ===》strlen的参数只能是char* 且必需是以''\0''末了的
char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);
功效是 4 3 3 2

第二个例子:

class X
{
int i;
int j;
char k;
};
X x;
cout<<sizeof(X)<<endl; 功效 12 ===》内存补齐
cout<<sizeof(x)<<endl; 功效 12 同上

第三个例子:

char szPath[MAX_PATH]

假如在函数内这样界说,那么sizeof(szPath)将会是MAX_PATH,可是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针巨细)

三、sizeof深入领略。

1.sizeof操纵符的功效范例是size_t,它在头文件中typedef为unsigned int范例。该范例担保能容纳实现所成立的最大工具的字节巨细。

2.sizeof是算符,strlen是函数。

3.sizeof可以用范例做参数,strlen只能用char*做参数,且必需是以”\0”末了的。sizeof还可以用函数做参数,好比:

short f();
printf("%d\n", sizeof(f()));

输出的功效是sizeof(short),即2。

4.数组做sizeof的参数不退化,通报给strlen就退化为指针了。

5.大部门编译措施 在编译的时候就把sizeof计较过了 是范例或是变量的长度这就是sizeof(x)可以用来界说数组维数的原因

char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;

#p#副标题#e#

6.strlen的功效要在运行的时候才气计较出来,时用来计较字符串的长度,不是范例占内存的巨细。

7.sizeof后假如是范例必需加括弧,假如是变量名可以不加括弧。这是因为sizeof是个操纵符不是个函数。

8.当合用了于一个布局范例时或变量, sizeof 返回实际的巨细, 当合用一静态地空间数组, sizeof 偿还全部数组的尺 寸。 sizeof 操纵符不能返回动态地被分配了的数组或外部的数组的尺寸

9.数组作为参数传给函数时传的是指针而不是数组,通报的是数组的首地点,如:

#p#分页标题#e#

fun(char [8])
fun(char [])
都等价于 fun(char *) 在C++里通报数组永远都是通报指向数组首元素的指针,编译器不知道数组的巨细假如想在函数内知道数组的巨细, 需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去

fun(unsiged char *p1, int len)
{
 unsigned char* buf = new unsigned char[len+1]  memcpy(buf, p1, len);
}

有关内容见: C++ PRIMER?

10.计较布局变量的巨细就必需接头数据对齐问题。为了CPU存取的速度最快(这同CPU取数操纵有关,具体的先容可以参考一些计较机道理方面的书),C++在处理惩罚数据时常常把布局变量中的成员的巨细凭据4或8的倍数计较,这就叫数据对齐(data alignment)。这样做大概会挥霍一些内存,但理论上速度快了。虽然这样的配置会在读写一些此外应用措施生成的数据文件或互换数据时带来未便。MS VC++中的对齐设定,有时候sizeof获得的与实际不等。一般在VC++中加上#pragma pack(n)的设定即可.可能假如要按字节存储,而不举办数据对齐,可以在Options对话框中修改Advanced compiler页中的Data alignment为按字节对齐。

11.sizeof操纵符不能用于函数范例,不完全范例或位字段。不完全范例指具有未知存储巨细的数据范例,如未知存储巨细的数组范例、未知内容的布局或连系范例、void范例等。如sizeof(max)若此时变量max界说为int max(),sizeof(char_v) 若此时char_v界说为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式四、竣事语

sizeof利用场所。

1.sizeof操纵符的一个主要用途是与存储分派和I/O系统那样的例程举办通信。譬喻:

void *malloc(size_t size),
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。

2.用它可以看看一范例的工具在内存中所占的单位字节。

void * memset(void * s,int c,sizeof(s))

3.在动态分派一工具时,可以让系统知道要分派几多内存。

4.便于一些范例的扩充,在windows中就有许多布局内型就有一个专用的字段是用来放该范例的字节巨细。

5.由于操纵数的字节数在实现时大概呈现变革,发起在涉及到操纵数字节巨细时用sizeof来取代常量计较。

6.假如操纵数是函数中的数组形参或函数范例的形参,sizeof给出其指针的巨细。

 

    关键字:

天才代写-代写联系方式