小编Leo*_*Leo的帖子

在if-else if链中使用Likely()/不可思议()预处理器宏

如果我有:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)

if (A)
    return true;
else if (B)
    return false;
...
else if (Z)
    return true;
else
    //this will never really happen!!!!
    raiseError();
    return false;
Run Code Online (Sandbox Code Playgroud)

我可以在最后一个条件检查中放置possible(),else if (likely(Z))以表示最终语句(else)非常不可能,而编译器不会影响先前检查的分支预测吗?

基本上,如果存在带分支预测器提示的单个条件语句,GCC是否会尝试优化整个if-else if块?

c++ macros gcc compiler-optimization likely-unlikely

6
推荐指数
1
解决办法
3242
查看次数

使用 C API 覆盖 Lua 中的赋值运算符

我的 C++ 程序中有对象作为用户数据传递给 Lua,并且我覆盖了此用户数据的元表,以便对对象索引的赋值(通过 __newindex 和 __index)导致对 C 的调用,从而转换赋值影响 C++ 对象或将 C++ 元素转换为 Lua 值(另一个用户数据或基本类型,如 bool、number、string)。用户数据作为参数传递给从我的 C++ 程序调用的类似事件的 Lua 函数。

luaL_newmetatable(L, "object");
lua_pushstring(L, "__index");
lua_pushvalue(L, -2);  /* pushes the metatable */
lua_settable(L, -3);  /* metatable.__index = metatable */

luaL_openlib(L, NULL, vallib_m, 0);
luaL_openlib(L, "internal", vallib_f, 0);

lua_pushstring(L, "__index");
lua_pushstring(L, "get");
lua_gettable(L, 2);  /* get val.get */
lua_settable(L, 1);  /* metatable.__index = val.get */

lua_pushstring(L, "__newindex");
lua_pushstring(L, "set");
lua_gettable(L, 2); /* get array.set */
lua_settable(L, 1); /* metatable.__newindex = val.set */ …
Run Code Online (Sandbox Code Playgroud)

c c++ lua variable-assignment metatable

4
推荐指数
1
解决办法
1027
查看次数