[php-src] Php内核的有趣高频宏
2021-03-07 03:28
标签:compiler type 内容 nbsp expec tor code oba lan 内容均以php-5.6.14为例. 1. EXPECTED 和 UNEXPECTED 宏,用在判断条件的时候。 ./Zend/zend.h:390 上面 __buildtin_expect 是针对 gcc 的优化,第一参数是判断条件,第二参数表示成立可能性大小,1 大,0 小. 例子,可以这样用: (p == NULL) 的可能性较小,第二参数传 0 的话,使用 UNEXPECTED。 2. 内核中的 EG,CG,AG 等这些都是 ZTS 的产物,线程安全下的兼容性宏,都以这种形式: ./Zend/zend_alloc.c:2405 ./Zend/zend_globals_macros.h:33 ./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 [php-src] Php内核的有趣高频宏 标签:compiler type 内容 nbsp expec tor code oba lan 原文地址:https://www.cnblogs.com/farwish/p/5709302.html#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
char *p = (char *) malloc(1024);
if (UNEXPECTED(p == NULL)) {
return p;
}
/**********************/
/* 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
....
#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
....
文章标题:[php-src] Php内核的有趣高频宏
文章链接:http://soscw.com/index.php/essay/61157.html