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

通过llama.cpp与羊驼聊天的网页界面- 详解 Serge 的启动使用

 

内容均以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

posted on 2020-05-14 23:16  ercom  阅读(343)  评论(0编辑  收藏  举报