深入理解sizeof

 

由几个例子说开去。

第一个例子:

char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
sizeof(*ss) 结果 1 ===》*ss是第一个字符
char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
sizeof(*ss) 结果 1 ===》*ss是第一个字符
 
char ss[100] = "0123456789";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前

int ss[100] = "0123456789";
sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4
strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以''\0''结尾的
char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);
结果是 4 3 3 2
 
第二个例子:
class X
{
int i;
int j;
char k;
};
X x;
cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐
cout<<sizeof(x)<<endl; 结果 12 同上
 
第三个例子:
char szPath[MAX_PATH]
如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)

三、sizeof深入理解。

        1、sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的

              字节大小。

        2、sizeof是算符,strlen是函数。

        3、sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如:

       short f();
       printf("%d\n", sizeof(f()));

            输出的结果是sizeof(short),即2。

        4、数组做sizeof的参数不退化,传递给strlen就退化为指针了。

          5、大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因

     char str[20]="0123456789";
     int a=strlen(str); //a=10;
     int b=sizeof(str); //而b=20;

       6、strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。

       7、sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。

       8、当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺 寸。

             sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸

      9、数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:

     fun(char [8])
     fun(char [])

            都等价于 fun(char *) 在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道

            数组的大小, 需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去

     fun(unsiged char *p1, int len)
     {
         unsigned char* buf = new unsigned char[len+1]
         memcpy(buf, p1, len);
     }

有关内容见: C++ PRIMER?

     10、计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考

             一 些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐

         (data alignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数

          据文件或交换数据时带来不便。MS VC++中的对齐设定,有时候sizeof得到的与实际不等。一般在VC++中加上#pragma pack

         (n)的设定即可.或者如果要按字节存储,而不进行数据对齐,可以在Options对话框中修改Advanced compiler页中的Data 

        alignment为按字节对齐。

     11、sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数

         组类型、未知内容的结构或联合类型、void类型等。如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时

         char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式

 

四、结束语
sizeof使用场合。

     1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如: 

  void *malloc(size_t size),
  size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。

    2、用它可以看看一类型的对象在内存中所占的单元字节。

   void * memset(void * s,int c,sizeof(s))

    3、在动态分配一对象时,可以让系统知道要分配多少内存。

    4、便于一些类型的扩充,在windows中就有很多结构内型就有一个专用的字段是用来放该类型的字节大小。

    5、由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。

    6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

标题基于SpringBoot和Vue的养老院系统设计与实现AI更换标题第1章引言介绍养老院系统的研究背景、意义,以及基于SpringBoot和Vue技术选型的原因。1.1研究背景与意义分析当前养老院信息化管理的需求,阐述本系统的实际意义。1.2国内外研究现状概述养老院信息系统的国内外发展现状与趋势。1.3论文方法与创新点介绍本文的设计思路、实现方法和创新之处。第2章相关技术概述简要介绍SpringBoot和Vue的技术特点和在养老院系统中的应用。2.1SpringBoot技术阐述SpringBoot框架的核心特性和优势。2.2Vue技术介绍Vue框架的基本原理及在前端开发中的应用。2.3技术选型分析分析选用SpringBoot和Vue进行养老院系统开发的合理性。第3章系统需求分析详细分析养老院系统的功能需求和性能需求。3.1用户需求调研介绍对养老院工作人员和老人的需求调研结果。3.2功能需求分析列举并解释系统的核心功能需求。3.3性能需求分析明确系统应满足的性能指标,如响应时间、并发用户数等。第4章系统设计详细介绍养老院系统的架构设计、数据库设计和界面设计。4.1架构设计给出系统的整体架构图,解释各模块之间的关系。4.2数据库设计阐述数据库表结构、关系和索引等设计细节。4.3界面设计展示系统的主要界面设计,包括色彩、布局和交互元素。第5章系统实现详细描述系统的实现过程,包括前后端代码编写、测试和部署等。5.1前端实现介绍基于Vue的前端页面实现细节。5.2后端实现阐述基于SpringBoot的后端服务实现过程。5.3系统测试与部署说明系统的测试方法、测试结果及部署环境。第6章系统评价与展望对养老院系统进行综合评价,并提出改进和扩展方向。6.1系统评价从功能、性能和用户体验等方面评价系统的实际效果。6.2未来工作展望根据系统评价结果,提出未来优化和扩展的建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值