C++ sizeof
2015-07-04 10:17
316 查看
1、字符串的sizeof与strlen:
如果是指针形式,如char* ss="0123456789"则sizeof(ss)结果为4,指针占4字节(int,long, float类型也都占四字节)。但是注意sizeof(*ss)结果为1,因为*ss表示第一个字符(char占一个字节)。
如果是数组形式,如char ss[100]="0123456789",那么sizeof(ss)结果为100。
strlen只能用于计算由\0结尾的字符串的长度,strlen(ss)无论是指针形式还是数组形式,都是输出10.
string对象的sizeof(string对象),无论字符串多长,结果都是32,因为这是string类的大小。如果想要获得字符串的长度,需要调用string类的成员函数string对象.length()
2、sizeof(结构体/类)
当结构体内的数据长度都小于处理器的位数的时候,按结构体里面最长的数据元素为对齐单位。当结构体内的数据长度有大于处理器的位数的时候,按处理器的位数为对齐单位,如64位按8字节对齐,32位按4字节对齐。
B对齐情况:
|bool|----|----|----|
|--------int--------|
|bool|----|----|----|
所以sizeof(B)结果是12
C对齐情况:
|--------int--------|
|bool|bool|----|----|
所以sizeof(C)结果是12
对齐存储的好处:
地址总线是按照对齐后的地址来访问。例如你想得到0x00000001开始的4字节内容,系统首先需以0x00000000读4字节,从中取得3字节,然后再从0x00000004开始读下一个4字节,再从中得到第一个字节,两次组合出你想要的内容。而数据对齐存储后,只需要一次读写即可。
空类的大小为1个字节,且单一继承,多重继承空类空间也是1,所以A,B,D的大小都是1。但是虚继承涉及到虚表(虚指针)所以size(C)的结果是4
3、sizeof(函数名)
在编译阶段函数名会被函数返回类型所取代。
如果是指针形式,如char* ss="0123456789"则sizeof(ss)结果为4,指针占4字节(int,long, float类型也都占四字节)。但是注意sizeof(*ss)结果为1,因为*ss表示第一个字符(char占一个字节)。
如果是数组形式,如char ss[100]="0123456789",那么sizeof(ss)结果为100。
strlen只能用于计算由\0结尾的字符串的长度,strlen(ss)无论是指针形式还是数组形式,都是输出10.
string对象的sizeof(string对象),无论字符串多长,结果都是32,因为这是string类的大小。如果想要获得字符串的长度,需要调用string类的成员函数string对象.length()
2、sizeof(结构体/类)
当结构体内的数据长度都小于处理器的位数的时候,按结构体里面最长的数据元素为对齐单位。当结构体内的数据长度有大于处理器的位数的时候,按处理器的位数为对齐单位,如64位按8字节对齐,32位按4字节对齐。
class B { private: bool m_bTemp; int m_nTemp; bool m_bTenp2; }; class C { private: int m_nTemp; bool m_bTemp; bool m_bTemp2; };
B对齐情况:
|bool|----|----|----|
|--------int--------|
|bool|----|----|----|
所以sizeof(B)结果是12
C对齐情况:
|--------int--------|
|bool|bool|----|----|
所以sizeof(C)结果是12
对齐存储的好处:
地址总线是按照对齐后的地址来访问。例如你想得到0x00000001开始的4字节内容,系统首先需以0x00000000读4字节,从中取得3字节,然后再从0x00000004开始读下一个4字节,再从中得到第一个字节,两次组合出你想要的内容。而数据对齐存储后,只需要一次读写即可。
class A{};class A2{}; class B: public A{}; class C:public virtual B{}; class D:public A, public A2;
空类的大小为1个字节,且单一继承,多重继承空类空间也是1,所以A,B,D的大小都是1。但是虚继承涉及到虚表(虚指针)所以size(C)的结果是4
3、sizeof(函数名)
在编译阶段函数名会被函数返回类型所取代。
相关文章推荐
- 统计选票
- C++继承
- 【c语言】判断一个字符串是否为另外一个字符串旋转之后的字符串
- 【c语言】字符串替换空格:请实现一个函数,把字符串中的每个空格替换成“%20”
- 【C语言】编写函数实现库函数atoi,把字符串转换成整形
- C++ Builder XE7 调用JAVA的JAR文件
- 【C语言】编写函数实现字符串旋转
- [C语言】模拟实现库函数strstr,查找子字符串
- 【C语言】判断一个字符串是否是一个字符串的旋转字符串
- 【C语言】字符串替换空格:实现一个函数,把字符串里的空格替换成“%20”
- 单循环链表的约瑟夫问题(C++)
- C++可变参数
- C语言 基础60题(3)
- C语言文件操作函数大全
- c++异常处理,,,同时处理除数为0以及开根号内部不能小于0
- 【C++ Primer Plus学习笔记】第二章:一个函数的基本的组成
- 什么时候用C而不用C++?
- C++可调用对象适配器和绑定器
- 双向链表的C++实现
- 【学习笔记】【C语言】文件的包含