如果我有:
#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++ 程序中有对象作为用户数据传递给 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)