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

  • Post author:
  • Post category:其他




– 一,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|—-|—-|—-|

所以大小为3

4=12字节

第二种类的数据对齐是下面的情况:

|———int——–|

|bool|bool|—-|—-|

所以大小为2

4=8字节

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

  1. sizeof: 分配的数组实际所占的内存空间大小。无关里面的存储内容。

    strlen:计算字符串的长度,以’\0’为字符串结束标志。
  2. sizeof是运算符,strlen是函数。
  3. sizeof可以用类型做参数。strlen只能用char *做参数,且必须是以’\0’结尾的。
  4. sizeof在编译过程中就计算了,strlen在运行的时候才计算出来



版权声明:本文为weixin_43853589原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。