Rik*_*rst 3 c++ optimization if-statement
好的,所以我正在做一些涉及键盘输入的东西.我现在有一个像这样的巨大功能:
return key == BB_KEY_SPACE ||
key == BB_KEY_ZERO ||
key == BB_KEY_ONE ||
key == BB_KEY_TWO ||
key == BB_KEY_THREE ||
key == BB_KEY_FOUR ||
key == BB_KEY_FIVE ||
key == BB_KEY_SIX ||
key == BB_KEY_SEVEN ||
key == BB_KEY_EIGHT ||
key == BB_KEY_NINE ||
key == BB_KEY_A ||
key == BB_KEY_B ||
key == BB_KEY_C ||
key == BB_KEY_D ||
key == BB_KEY_E ||
key == BB_KEY_F ||
key == BB_KEY_G ||
key == BB_KEY_H ||
key == BB_KEY_I ||
key == BB_KEY_J ||
key == BB_KEY_K ||
key == BB_KEY_L ||
key == BB_KEY_M ||
key == BB_KEY_N ||
key == BB_KEY_O ||
key == BB_KEY_P ||
key == BB_KEY_Q ||
key == BB_KEY_R ||
key == BB_KEY_S ||
key == BB_KEY_T ||
key == BB_KEY_U ||
key == BB_KEY_V ||
key == BB_KEY_W ||
key == BB_KEY_X ||
key == BB_KEY_Y ||
key == BB_KEY_Z ||
key == BB_KEY_NUMPAD0 ||
key == BB_KEY_NUMPAD1 ||
key == BB_KEY_NUMPAD2 ||
key == BB_KEY_NUMPAD3 ||
key == BB_KEY_NUMPAD4 ||
key == BB_KEY_NUMPAD5 ||
key == BB_KEY_NUMPAD6 ||
key == BB_KEY_NUMPAD7 ||
key == BB_KEY_NUMPAD8 ||
key == BB_KEY_NUMPAD9 ||
key == BB_KEY_MULTIPLY ||
key == BB_KEY_PLUS ||
key == BB_KEY_SEPERATOR ||
key == BB_KEY_MINUS ||
key == BB_KEY_DECIMAL ||
key == BB_KEY_DIVIDE ||
key == BB_KEY_OEM1 ||
key == BB_KEY_OEMPLUS ||
key == BB_KEY_OEMCOMMA ||
key == BB_KEY_OEMMINUS ||
key == BB_KEY_OEMPERIOD ||
key == BB_KEY_OEM2 ||
key == BB_KEY_OEM3 ||
key == BB_KEY_OEM4 ||
key == BB_KEY_OEM5 ||
key == BB_KEY_OEM6 ||
key == BB_KEY_OEM7 ||
key == BB_KEY_OEM8 ||
key == BB_KEY_OEM102;`
Run Code Online (Sandbox Code Playgroud)
有没有一种优化方法?我假设它需要一些处理能力来验证所有这些if语句的东西.在查看诊断时,似乎也需要花费一些时间.我想知道是否有更聪明的方法来做这件事.
Sam*_*hik 11
将其转换为switch语句:
switch (key) {
case BB_KEY_SPACE:
case BB_KEY_ZERO:
case BB_KEY_ONE:
// ... and so on
Run Code Online (Sandbox Code Playgroud)
你的编译器很聪明.如果这些文字常量只形成少数几个连续整数值的范围,编译器将处理将其优化为少量比较,以实现对每个值范围的边界检查.
如果没有,编译器可能会使用一些其他启发式工具来提出一组优化的比较.
现代编译器也可能足够聪明,可以对冗长的if()版本使用相同的优化,但使用该switch语句可以帮助编译器"看到光明的一天",并找出解决所有这些问题的最佳方法. .
dxi*_*xiv 11
利用从该意见收集的其他信息key是一种char类型,有256个可能的值key.每个可能值的返回值key可以存储到索引的全局数组中key,并通过简单地返回key数组的第th个元素来检索.
char arr[256] = { 0 };
arr[BB_KEY_SPACE] = 1;
arr[BB_KEY_ZERO] = 1;
/* ... */
arr[BB_KEY_OEM102] = 1;
bool f(char key)
{
return arr[(unsigned)key] != 0; /* == 1 for the BB_KEY_* values */
}
Run Code Online (Sandbox Code Playgroud)
std::vector<bool> arr(256);char而不是char数组,可以保存一些内存(以可忽略的速度惩罚).
arr是一个已知的,固定大小的数组,std::bitset可以(应该?)代替std::vector<bool>.
虽然这是完全正确的,但它们之间的选择长期以来一直是讨论和争论的主题.搜索SO和/或谷歌搜索std::bitset vs std::vector<bool>将找到双方的一些意见.