内容均以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
来源:oschina
链接:https://my.oschina.net/u/4306295/blog/4278997