• [php-src] Php内核的有趣高频宏


    内容均以php-5.6.14为例.

     1.

    EXPECTED 和 UNEXPECTED 宏,用在判断条件的时候。

    ./Zend/zend.h:390

    #if (defined (__GNUC__) && __GNUC__ > 2 ) && !defined(DARWIN) && !defined(__hpux) && !defined(_AIX)
    # define EXPECTED(condition)   __builtin_expect(condition, 1)
    # define UNEXPECTED(condition) __builtin_expect(condition, 0)
    #else
    # define EXPECTED(condition)   (condition)
    # define UNEXPECTED(condition) (condition)
    #endif

    上面 __buildtin_expect 是针对 gcc 的优化,第一参数是判断条件,第二参数表示成立可能性大小,1 大,0 小.

    例子,可以这样用:

    char *p = (char *) malloc(1024);
    if (UNEXPECTED(p == NULL)) {
      return p;
    }

    (p == NULL) 的可能性较小,第二参数传 0 的话,使用 UNEXPECTED。

     2.

    内核中的 EG,CG,AG 等这些都是 ZTS 的产物,线程安全下的兼容性宏,都以这种形式:

    ./Zend/zend_alloc.c:2405

    /**********************/
    /* Allocation Manager */
    /**********************/
    
    typedef struct _zend_alloc_globals {
        zend_mm_heap *mm_heap;
    } zend_alloc_globals;
    
    #ifdef ZTS
    static int alloc_globals_id;
    # define AG(v) TSRMG(alloc_globals_id, zend_alloc_globals *, v)
    #else
    # define AG(v) (alloc_globals.v)
    static zend_alloc_globals alloc_globals;
    #endif
    
    ....

    ./Zend/zend_globals_macros.h:33

    #ifndef ZEND_GLOBALS_MACROS_H
    #define ZEND_GLOBALS_MACROS_H
    
    typedef struct _zend_compiler_globals zend_compiler_globals;
    typedef struct _zend_executor_globals zend_executor_globals;
    typedef struct _zend_php_scanner_globals zend_php_scanner_globals;
    typedef struct _zend_ini_scanner_globals zend_ini_scanner_globals;
    
    BEGIN_EXTERN_C()
    
    /* Compiler */
    #ifdef ZTS
    # define CG(v) TSRMG(compiler_globals_id, zend_compiler_globals *, v)
    int zendparse(void *compiler_globals);
    #else
    # define CG(v) (compiler_globals.v)
    extern ZEND_API struct _zend_compiler_globals compiler_globals;
    int zendparse(void);
    #endif
    
    /* Executor */
    #ifdef ZTS
    # define EG(v) TSRMG(executor_globals_id, zend_executor_globals *, v)
    #else
    # define EG(v) (executor_globals.v)
    extern ZEND_API zend_executor_globals executor_globals;
    #endif
    
    ....

    ./Zend/zend_globals.h:72, 168

    struct _zend_compiler_globals { } 中的成员都能统一用 EG() 访问。

    struct _zend_executor_globals { } 成员统一用 CG() 访问。

    还有其它。

    Link:https://www.cnblogs.com/farwish/p/5709302.html

  • 相关阅读:
    3里氏代换原则LSP
    2单一职责原则SRP
    1开放封闭原则OCP
    24访问者模式Visitor
    python json模块,处理json文件的读写
    python zip 绑定多个list
    python 字符串重复多次的技巧 *操作符
    python 刷新缓冲区,实时监测
    python os.getcwd 获取工作目录
    python datetime 获取时间
  • 原文地址:https://www.cnblogs.com/farwish/p/5709302.html
Copyright © 2020-2023  润新知