• strlen 与 sizeof 的区别


    void
    ngx_time_init(void)
    {
        ngx_cached_err_log_time.len = sizeof("1970/09/28 12:00:00") - 1;
        ngx_cached_http_time.len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1;
        ngx_cached_http_log_time.len = sizeof("28/Sep/1970:12:00:00 +0600") - 1;
        ngx_cached_http_log_iso8601.len = sizeof("1970-09-28T12:00:00+06:00") - 1;
        ngx_cached_syslog_time.len = sizeof("Sep 28 12:00:00") - 1;
    
        ngx_cached_time = &cached_time[0];
    
        ngx_time_update();
    }
    

    阅读nginx中的ngx_time_init发现对于常量字符串的操作是使用sizeof操作然后进行-1操作,可见nginx对于性能的追求与细节的完美。 sizeof是操作符而不是函数,因此可以在编译过程中直接获取,而strlen为函数需要在运行中才能获取。

    附:sizeof和strlen的区别:

    一、sizeof
      sizeof(...)是运算符,在头文件中typedef为unsignedint,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
      它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
      由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
      具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
      数组——编译时分配的数组空间大小;
      指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
      类型——该类型所占的空间大小;
      对象——对象的实际占用空间大小;
      函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
     二、strlen
      strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
      它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。

  • 相关阅读:
    Spring中的destroy-method方法
    github Pull Request合入全流程介绍
    vue-router动态路由设置参数可选
    github上fork原项目,如何将本地仓库代码更新到最新版本?
    github的pull Request使用
    vue2.X版本vue-cli生成项目后运行失败,报错信息为getaddrinfo ENOTFOUND localhost
    npm在linux即mac下更新时报错
    数组Array和字符串String的indexOf方法,以及ES7(ES2016)中新增的Array.prototype.includes方法
    less的使用总结
    ssh连接github连不上
  • 原文地址:https://www.cnblogs.com/davad/p/5155998.html
Copyright © 2020-2023  润新知