Linux内核0.0.1 vs 2.6.36,“ctype.h”,有什么区别?

时间:2012-05-03 20:45:12

标签: linux kernel performance ctype

从1.0.1

开始,linux内核2.6.36的效率如何

0.0.1:

  1. 据我所知,在这个版本中,Linus分配了值 c(输入函数的变量)到temp变量并进行操作 函数内部的temp变量并返回temp变量。

  2. 这在tolower / toupper函数中发生。

  3. 2.6.36:

    1. 在tolower / toupper中,他改变了它。
    2. ctype是const。
    3. 编写新函数ismask。
    4. 我想知道什么?:

      为什么要做出这些改变?它给家带来了什么好处?

      我已经分别在内核版本0.0.1和2.6.36中列出了ctype.h文件。

       **** ctype.h, linux-0.01 *****
      
          #ifndef _CTYPE_H
          #define _CTYPE_H
      
          #define _U      0x01    /* upper */
          #define _L      0x02    /* lower */
          #define _D      0x04    /* digit */
          #define _C      0x08    /* cntrl */
          #define _P      0x10    /* punct */
          #define _S      0x20    /* white space (space/lf/tab) */
          #define _X      0x40    /* hex digit */
          #define _SP     0x80    /* hard space (0x20) */
      
          extern unsigned char _ctype[];
          extern char _ctmp;
      
          #define isalnum(c) ((_ctype+1)[c]&(_U|_L|_D))
          #define isalpha(c) ((_ctype+1)[c]&(_U|_L))
          #define iscntrl(c) ((_ctype+1)[c]&(_C))
          #define isdigit(c) ((_ctype+1)[c]&(_D))
          #define isgraph(c) ((_ctype+1)[c]&(_P|_U|_L|_D))
          #define islower(c) ((_ctype+1)[c]&(_L))
          #define isprint(c) ((_ctype+1)[c]&(_P|_U|_L|_D|_SP))
          #define ispunct(c) ((_ctype+1)[c]&(_P))
          #define isspace(c) ((_ctype+1)[c]&(_S))
          #define isupper(c) ((_ctype+1)[c]&(_U))
          #define isxdigit(c) ((_ctype+1)[c]&(_D|_X))
      
          #define isascii(c) (((unsigned) c)<=0x7f)
          #define toascii(c) (((unsigned) c)&0x7f)   
      
          #define tolower(c) (_ctmp=c,isupper(_ctmp)?_ctmp+('a'+'A'):_ctmp)
          #define toupper(c) (_ctmp=c,islower(_ctmp)?_ctmp+('A'-'a'):_ctmp)
      
      
          #endif
      
      ****** ctype.h, linux-2.6.36 *******
      
      #ifndef _LINUX_CTYPE_H
      #define _LINUX_CTYPE_H
      
      /*
      * NOTE! This ctype does not handle EOF like the standard C
      * library is required to.
      */
      
      #define _U      0x01    /* upper */
      #define _L      0x02    /* lower */
      #define _D      0x04    /* digit */
      #define _C      0x08    /* cntrl */
      #define _P      0x10    /* punct */
      #define _S      0x20    /* white space (space/lf/tab) */
      #define _X      0x40    /* hex digit */
      #define _SP     0x80    /* hard space (0x20) */
      
      extern const unsigned char _ctype[];
      
      #define __ismask(x) (_ctype[(int)(unsigned char)(x)])
      
      #define isalnum(c)      ((__ismask(c)&(_U|_L|_D)) != 0)
      #define isalpha(c)      ((__ismask(c)&(_U|_L)) != 0)
      #define iscntrl(c)      ((__ismask(c)&(_C)) != 0)
      #define isdigit(c)      ((__ismask(c)&(_D)) != 0)
      #define isgraph(c)      ((__ismask(c)&(_P|_U|_L|_D)) != 0)
      #define islower(c)      ((__ismask(c)&(_L)) != 0)
      #define isprint(c)      ((__ismask(c)&(_P|_U|_L|_D|_SP)) != 0)
      #define ispunct(c)      ((__ismask(c)&(_P)) != 0)
      /* Note: isspace() must return false for %NUL-terminator */
      #define isspace(c)      ((__ismask(c)&(_S)) != 0)
      #define isupper(c)      ((__ismask(c)&(_U)) != 0)
      #define isxdigit(c)     ((__ismask(c)&(_D|_X)) != 0)
      
      #define isascii(c) (((unsigned char)(c))<=0x7f)
      #define toascii(c) (((unsigned char)(c))&0x7f)
      
      static inline unsigned char __tolower(unsigned char c)
      {
             if (isupper(c))
                     c -= 'A'-'a';
             return c;
      }
      
      static inline unsigned char __toupper(unsigned char c)
      {
             if (islower(c))
                     c -= 'a'-'A';
             return c;
      }
      
      #define tolower(c) __tolower(c)
      #define toupper(c) __toupper(c)
      
      #endif
      

1 个答案:

答案 0 :(得分:2)

  

为什么要做出这些改变?它给家带来了什么好处?

首先,您不必再在代码调用isupper中定义ctemp变量,从而减少代码行数。它显然也避免泄漏实现细节。