您的位置:首页 > 编程语言 > C语言/C++

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字节对齐。

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(函数名)
在编译阶段函数名会被函数返回类型所取代。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: