曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4323|回复: 0
打印 上一主题 下一主题

sizeof 的使用场合与 strlen 的区别

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2011-11-18 10:00:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
sizeof 的主要使用场合
1. sizeof 一个主要用途是与 存储分配 和 I/O系统 那样的例程进行通信,比如:
[Plain Text] 纯文本查看 复制代码
void *malloc(sizeof(mysize_var));
size_t fread(void *ptr, sizeof(mysize_var), size_t nmemb, FILE *stream);


2. 用 sizeof 来查看某种类型的对象在内存中所占的单元字节,比如:
[Plain Text] 纯文本查看 复制代码
void *memset(void *s, int c, sizeof(s));


3. 动态内存分配对象时,可以让系统知道要分配多少内存。

4. 便于一些类型的扩充。在 Windows 中有许多结构类型就有一个专用的字段用来存放该类型的字节大小。

5. 由于操作数的字节数在实现时可能出现变化,建议在涉及操作数字节大小时使用 sizeof 代替常量计算。

6. 如果操作数是函数中的数组形参或函数类型的形参,sizeof 给出其指针的大小。


sizeof 和 strlen 的区别
1. sizeof操作符的结果类型是 size_t (一般被 typedef 定义为 unsigned int 类型),该类型保证能容纳实现所建立的最大对象的字节大小。

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

3. sizeof 可以用类型做参数,strlen 只能用 char* 做参数,且必须是以 '\0' 结尾的。此外,sizeof 还可以用函数做参数,比如:
[C++] 纯文本查看 复制代码
#include <stdio.h>


double func(void)
{
        return 10.2;
}


int main()
{




        printf ("%d\n", sizeof(func()));


        return 0;
}

输出结果为 8 。由此可见,当函数作为 sizeof 的参数时,sizeof 的值为函数的返回值。如果函数的没有返回值,即 void 类型,那么 sizeof 的结果为 1 。注意:GCC 编译器允许 sizeof 返回类型为 void 的函数,而 VC 这样的编译器是不允许的。

4. 数组做 sizeof 的参数时不退化, sizeof 的值为数组可容纳的字节大小;但数组名传递给 strlen 时就退化为字符指针,比如数组的内容中的内容是 字符+'\0' 结尾的串,那么 strlen 后得到的长度是字符的个数,否则值不确定。

5. 大部分编译程序在编译的时候就把 sizeof 计算过了,结果是类型或者是变量的长度。这就是 sizeof(x) 可以用来定义数组维数的原因。

6. strlen 的结果要在运行时才能计算出来,用来计算字符串的长度,而不是类型占用内存的大小。

7. sizeof 后如果是类型,必须加括号,如果是变量名可以不加括号。这是因为 sizeof 是个操作数而不是函数,比如:
[C++] 纯文本查看 复制代码
     int a = 10;


        printf ("%d\n", sizeof a);


        printf ("%d\n", sizeof(int));

上面的两个打印的输出结果都为 4 。

8. 当使用了一个结构类型或变量时,sizeof 返回实际的大小。当使用一静态空间的数组时,sizeof 返回全部数组的尺寸。sizeof 操作符不能返回被动态分配的数组的尺寸。

9. 数组作为参数传给函数时传递的是指针而不是数组,传递的是数组的首地址,如 func(char [8]), func(char []) 都等价于 func (char *) 。在 C++ 里传递数组永远都是传递指向数组首地址元素的指针,编译器不知道数组的大小。如果想在函数内知道数组的大小,需要这样做:进入函数后用 memcopy 将数组复制出来,长度由另一个形参传进去,比如:
[C++] 纯文本查看 复制代码
func (unsigned char *p1, int len)
{  
   unsigned char *buf = new unsigned char[len+1];
   memcpy(buf, p1, len);
}


10. 计算结构变量的大小必须讨论数据对其问题。为了使 CPU 存取的速度最快,C++ 在处理数据时经常把结构变量中的成员的大小按照 4 或 8 的倍数计算,这就是数据对其(data alignment) 。
这样虽然可能会浪费一些内存,但在理论上 CPU 速度快了。

11. sizeof 操作符不能用于不完全类型或位字段。不完全类型是指具有未知存储大小数据的数据类型,如未知存储大小的数组类型、位置内容的结构或联合类型、void 类型等。注意,如果 sizeof 一个返回类型是 void 的函数名,在 GCC 中会返回 1,但在 VC 中则不被允许。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-28 03:45 , Processed in 0.076320 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表