对sizeof的思考
2016-04-04 01:24
148 查看
一.sizeof的特点(与strlen比较)
1.sizeof是运算符,strlen是函数,这意味着编译程序在编译的时候就把sizeof计算过了,所以sizeof(x)可以用来定义数组维数。
例如
2.sizeof能够返回变量或类型所占的字节空间大小,而strlen只能够返回字符串的大小,即字符串必须以'\0'结尾。
二.sizeof计算不同类型的值的大小
1.变量
sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
可以按以下几种变量类型分类:
a.对基本数据类型的变量,取得的是数据类型的大小
b.对结构体类型的变量,取得的是结构体变量所占空间的大小。这其中涉及到字节对齐的问题。
c.对数组类型的变量,取得的是数组的大小,并不是数组元素的个数,例如:
d.对指针类型(包括函数指针)的变量,取得的是指针的大小,即机器字长大小。
e.对解引用指针,返回指针所指向的对象的大小,指针不需要有效。
f.对数组形参,与指针相同返回的是指针的大小,因为c语言中并不传递数组的每个元素值,只是将数组的首地址传给函数。例如
2.基本的数据类型
得到的是基本类型的大小。
三.其他
当适用于一个结构类型时或变量, sizeof 返回实际的大小,当适用于静态的空间数组, sizeof 归还全部数组的尺寸;sizeof 操作符不能返回被动态分派的数组或外部数组的尺寸。
其实理解 sizeof 只需要抓住一个要点:栈
程序存储分布有三个区域:栈、静态和动态。
能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的所有指针间接操作的。
sizeof 操作符,计算的是对象在栈上的投影体积;记住这个就很多东西都很清楚了。
不管指针指向的内容在什么地方,sizeof 得到的都是指针的栈大小
C++ 中对引用的处理比较特殊;sizeof 一个引用得到的结果是 sizeof 一个被引用的对象的大小;所以
r 引用的是整个的 test 对象而不是指向 test 的指针,所以 sizeof r 的结果和 sizeof test 完全相同。
1.sizeof是运算符,strlen是函数,这意味着编译程序在编译的时候就把sizeof计算过了,所以sizeof(x)可以用来定义数组维数。
例如
int arr[sizeof(int)];//相当于int arr[4];
2.sizeof能够返回变量或类型所占的字节空间大小,而strlen只能够返回字符串的大小,即字符串必须以'\0'结尾。
char str[20]="0123456789"; int a=strlen(str); //a=10;得到的是字符串的长度 int b=sizeof(str); //而b=20;得到的是数组的长度
二.sizeof计算不同类型的值的大小
1.变量
sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
可以按以下几种变量类型分类:
a.对基本数据类型的变量,取得的是数据类型的大小
b.对结构体类型的变量,取得的是结构体变量所占空间的大小。这其中涉及到字节对齐的问题。
c.对数组类型的变量,取得的是数组的大小,并不是数组元素的个数,例如:
int a[3]; sizeof(a)=3*4;而不是等于3.
d.对指针类型(包括函数指针)的变量,取得的是指针的大小,即机器字长大小。
short f(); printf("%d\n", sizeof(f()));///输出2,
e.对解引用指针,返回指针所指向的对象的大小,指针不需要有效。
f.对数组形参,与指针相同返回的是指针的大小,因为c语言中并不传递数组的每个元素值,只是将数组的首地址传给函数。例如
int fun(int a[3]) {..... sizeof(a)=4;//而不是3*4; }
2.基本的数据类型
得到的是基本类型的大小。
三.其他
当适用于一个结构类型时或变量, sizeof 返回实际的大小,当适用于静态的空间数组, sizeof 归还全部数组的尺寸;sizeof 操作符不能返回被动态分派的数组或外部数组的尺寸。
其实理解 sizeof 只需要抓住一个要点:栈
程序存储分布有三个区域:栈、静态和动态。
能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的所有指针间接操作的。
sizeof 操作符,计算的是对象在栈上的投影体积;记住这个就很多东西都很清楚了。
char const *static_string = "Hello"; //sizeof(static_string)是sizeof一个指针,所以在32bitsystem是4 char stack_string[] = "Hello"; //sizeof(stack_string)是sizeof一个数组,所以是6*sizeof(char) char *string = new char[6]; strncpy(string,"Hello",6"); //sizeof(string)是sizeof一个指针,所以还是4。 //和第一个不同的是,这个指针指向了动态存储区而不是静态存储区。
不管指针指向的内容在什么地方,sizeof 得到的都是指针的栈大小
C++ 中对引用的处理比较特殊;sizeof 一个引用得到的结果是 sizeof 一个被引用的对象的大小;所以
struct test{ int a, b, c, d, e, f, g, h; }; int main(){ test& r = *newtest; cout<<sizeof(test)<<endl;//32 cout<<sizeofr<<endl;//也是32 }
r 引用的是整个的 test 对象而不是指向 test 的指针,所以 sizeof r 的结果和 sizeof test 完全相同。
相关文章推荐
- Tsinsen A1116 幂方分解
- <<web>> Sublime /emmet /css
- Gradle修改Maven仓库
- jQuery源码浅析
- Spark 云计算 ML 机器学习教程 以及 SPARK使用教程
- 如何线程安全地遍历List:Vector、CopyOnWriteArrayList
- 记录GNU Compiler Collection的使用
- 如何在php中正确的使用json(转)
- Linux系统中校验下载文件的完整性方法(MD5,SHA1,PGP)
- 数据结构和算法 – 2.基础查找算法
- 基于DEV的命令行调试
- 访客/用户与DNS服务器、网站空间服务器、建站宝盒之间的交互关系图
- 范围查询(Range)
- Stegano之binwalk、C32Asm
- 树莓3 集群
- C++中关于new及内存地址的思考
- 读《嵌入式系统项目分析入门与实践》③
- 游旗丶引莫自学经验总结
- 鹅厂2016实习生招聘试题1
- << 学习思路分析 >> 认真分析仔细对待