sizeof的一些知识 (以及与strlen()的对比)

- 一,sizeof() 的一些常见使用

   char* s1="0123456789"; 
   
   char s2[]="0123456789";
   
   char s3[100]="0123456789";
   
   int s4[100];
   
   char q1[]="abc";
   
   char q2[]="a\n";
   
   char* q3="a\n";
   
   char *str1=(char *)malloc(100);
   
   void *str2=(void*)malloc(100);
  • 如上,我们使用sizeof()。结果为多少呢

    s1 是一个字符指针,指针的大小是一个定值,就是四个字节。所以 sizeof(s1)是4字节。
    s2 是一个字符数组,这个数组最初未定大小,由填充决定,共有10个字符+"\0" 一共11个字节。
    s3 也是一个字符数组,这个数组预分配100,所以他的大小一共是100字节。
    s4 是一个整形数组,这个数组预分配100,但每个整形变量所占空间是4,所以大小为400字节。
    q1类似于s2,大小为4字节。
    q2类似于s2,一个\n算作一位,所以大小为3字节。
    q3同s1,为字符指针,大小为4字节。
    str1,str2 同样为字符指针,大小为4字节。

二,sizeof()中的结构体

  • 一些结构体
    struct{
    short a1;
    short a2;
    short a3;
    }A;

    struct{
    long a1;
    short a2;
    }B;

A和B是两个结构体
结构体A中有三个short类型变量,各自以2字节对齐,则a1,a2,a3都取2字节对齐,sizeof(A)为6,其也是2的整数倍。
B中a1为4字节对齐,a2为2字节对齐,结构体默认对齐参数为8,则a1取4字节对齐,a2取2字节对齐;结构体大小为6字节,6不为4的倍数,补空字节,增到8,符合所有条件,则sizeof(B)为8.

在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素的长度都小于处理器的位数的时候,便以结构里面最长的数据元素为对齐单位,也就是说,结构体的长度一定是结构体里面最长数据元素的整数倍如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对齐单位。但是结构体内存类型相同的连续元素和数组一样,将在连续空间内。

三,sizeof()中的类

以下代码为32位机器编译,数据是以4字节为对齐单位,这两个类的输出结果为什么不同?

class B{
	private:
	bool m_bTemp;
	int    m_nTemp;
	bool m_bTemp2;
};

class C{
	private:
	int 	m_nTemp;
	bool m_bTemp;
	bool m_bTemp2;
};

cout << sizeof(B) << endl;   //12
cout << sizeof(C) <<endl;	//8

第一种类的数据对齐是下面的情况:
|bool|----|----|----|
|---------int--------|
|bool|----|----|----|
所以大小为34=12字节
第二种类的数据对齐是下面的情况:
|---------int--------|
|bool|bool|----|----|
所以大小为2
4=8字节

四,sizeof() 和strlen() 之间的区别

  1. sizeof: 分配的数组实际所占的内存空间大小。无关里面的存储内容。
    strlen:计算字符串的长度,以’\0’为字符串结束标志。
  2. sizeof是运算符,strlen是函数。
  3. sizeof可以用类型做参数。strlen只能用char *做参数,且必须是以’\0’结尾的。
  4. sizeof在编译过程中就计算了,strlen在运行的时候才计算出来
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值