zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    4、linux-grep awk sed and cuf sort uniq join
    2、linux-compress and uncompresse
    1、linux-wget
    Blast 如何使用Blast+(Linux)转载
    1、R-reshape2-cast
    2、R-reshape2-melt
    doc下批处理文件的感想
    关于大数的四则运算
    hadoop分布式安装教程(转)
    关于java中sizeof的问题
  • 原文地址:https://www.cnblogs.com/davad/p/5155998.html
Copyright © 2011-2022 走看看