C++ sizeof
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字节对齐。
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(函数名)
在编译阶段函数名会被函数返回类型所取代。