sizeof
来源:互联网 发布:鞍山plc编程培训 编辑:程序博客网 时间:2024/05/16 12:13
今天特别学习了下sizeof。整理了下。效率不高。 为了能巩固,下次写另一个。完成的时候,。再看这复习一次。毕竟平时用的不多。容易生疏。也是因为没有发掘出原理吧
语法:
sizeof(类型说明符,数组名,表达式)
返回在内存中所占的字节数
一般不会对表达式进行计算。而根据结果类型确定大小
1.基本数据类型的sizeof, char 1 ,int 4
2.指针的sizeof 为 4(32位系统下)
3.数组的sizeof, 是整个数组的字节数
int a[10]
sizeof( a ) = sizeof( int ) *10 //是整个数组的字节数
sizeof( a[15] ) = sizeof( int ) //和下标无关
int b[2][3]
sizeof( b ) = sizeof( int ) *3 *2 = 24
sizeof( b[5] ) = sizeof( int ) *3 =12 //存放的相当于 一个一维数组的数组名 。因而获取的和一维数组一样。不是指针大小
sizeof( b[5][5]) = sizeof( int ) = 4
sizeof(&b) = 4
sizeof(&b[2]) = 4
这里发现数组名很神奇。。
之前的印象是。数组名就是指向数组首地址的指针。
而确实在大部分情况下可以把 数组名当成 指向数组首地址的指针来使用,不过不能对它进行修改
但是。如果他的类型是指针的话。为什么sizeof(数组名) 得出来的却是整个数组存放的字节大小(应该是 指针大小呀 = 4)
所以。数组名 不完全等同于 指针
那有什么区别呢?
1.数组名有指针常量的属性。不能修改
2.直接使用数组名的时候。会带有数组的信息(如sizeof),而转换成普通的指针后~只是带有4个字节的整数
特别的:
当数组作为形参传入函数时:
一维数组: int a[] = int *
二维数组: a[][3] = (*a)[3] // 特别的: 二维数组传递的时候 必须要 指明 列的个数(每个小数组(一行)的元素个数)
同时,数组名类型 真正变为指针。不再带有数组的大小信息。只是普通的指针
//测试过程中发现:
char a[2][3] = {"aa","bb"}; 关于这种定义方式,等于 {{'a','a','\0'},{'b','b','\0'}}
对于动态数组
int *p =new int[10];
cout<<sizeof(p)<<endl; p仍然只是一个普通的指针。说明sizeof确实是在编译时就计算的
4. struct 的sizeof
特别注意 会自动 字节对齐。调整成员所占的空间
1.和最宽的数据类型字节数对齐(相邻的,想家不足对齐字节数的。会压缩在一起),除非用特殊指令设置 对齐字节数
2.空结构体占1位
3.相邻的位域字段可能会压缩成一个(非位域字段穿插在其中,则不会压缩)
特别的: struct 嵌套 struct,算对齐字节的时候,是把嵌套struct里面的数据类型拿出来一起比较的。
并且struct 里面的数组 也是拆分开的.如: char a[10] 看成 char a0; char a1....................a10
所以这个情况下 对数组取对齐字节的时候。只取数组元素类型。而取空间类型时。类型大小*元素个数
5.Union 的sizeof
成员中,取类型的最大值就是了。不用累计。因为没用过。不了解Union和struct的区别
6. 函数的sizeof
即函数返回值 类型的sizeof
0 0
- SIZEOF
- Sizeof
- sizeof
- sizeof
- sizeof
- sizeof
- sizeof
- sizeof............
- sizeof
- sizeof
- sizeof
- sizeof
- sizeof
- sizeof
- sizeof
- sizeof
- sizeof
- sizeof
- [Webservice]SoapUI 调试和生成soap模板
- JQuery选择器
- vim插件的安装与配置
- TortoiseGit安装与使用
- cocos2d基础篇笔记四
- sizeof
- 从mysql的data文件夹(*.frm,*.ibd,ibdata1)下恢复原来数据库的表及其数据(无语但是百发百中的方法)
- Application简介(二)--重写应用程序的生命周期事件
- OCP-1Z0-051 第153题 集合操作和JOIN
- 在 EBS Form 查找界面点 "Find" 之后都发生了什么?
- 黑马程序员——object-c之类的声明和实现
- python7
- android示例之AppWidget(2)
- hibernate缓存