求如何在VC里用跳转表的方式编译swich

TianXiang233 2005-09-08 08:42:57
我做了一个庞大的switch,case的值是0~255乱序,
希望被编译成跳转表,否则效率太低了。
但不知道有没有编译选项或指令可以达到这个目的。

...全文
504 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
f4_101 2005-12-11
  • 打赏
  • 举报
回复
多而乱的跳转,用一般的方法不便于管理,可以考虑用高级的方法实现,虽然这样会损失一定的运行效率,但是代码维护方便,这个折中是可取的.
greenteanet 2005-12-11
  • 打赏
  • 举报
回复
mark
edrftgyh 2005-11-25
  • 打赏
  • 举报
回复
MARK
tudou614 2005-11-16
  • 打赏
  • 举报
回复
MARK下
fine10000 2005-11-01
  • 打赏
  • 举报
回复
学习
laomai 2005-10-21
  • 打赏
  • 举报
回复
居然老蒋跑到这里灌水了,呵呵
herryhuang 2005-09-30
  • 打赏
  • 举报
回复
只能通过汇编实现。
蒋晟 2005-09-12
  • 打赏
  • 举报
回复
switch语句通常编译成比较高效的跳转表。在我看来唯一的通用的优化是将最常用的case语句放在前面以尽量避免在跳转时跨越内存块。对于非整型分支取值,也可以用std::map来做跳转,但是需要付出一定的性能。
如果分支值属于常量的话,也可以把switch换成模板
template<int I>
class CASE {
public:
static inline void f() //default
{ }
};
class CASE<value1> {
public:
static inline void f()
{ }
};
class CASE<value2> {
public:
static inline void f()
{}
};
CASE<I>::f();
但是分支值一般都不是常量。另外一种方法是使用循环模板:
template <template <int> class T, int I>
struct Root
{
int run(int pos) const
{
const T<I>& ref = static_cast<const T<I>&>(*this);
if (pos== I)
return ref.getValue();
return T<I-1>().run(pos);
}
};
但是
1 很多不标准的编译器,例如VC,不支持循环模板
2 分支值越大,循环次数越多,函数调用次数越多。

如果CASE中的处理代码需要被重载,简单的方案就是使用虚函数表,但是在分支值取值范围很大的时候虚函数表可能过于庞大,这时候类似于MFC实现的有缓存的线性查找性能可能比较高一些。
  • 打赏
  • 举报
回复
别人既然在乎 switch 是否被编译器编译为跳转表, 肯定也在乎函数调用的成本啦.
不过如果不想搞的太麻烦, 看来是只有用函数指针鸟哦.
蒋晟 2005-09-12
  • 打赏
  • 举报
回复
差不多啦,多一层函数调用而已
  • 打赏
  • 举报
回复
MFC的是函数指针啦,木意思哦....
蒋晟 2005-09-10
  • 打赏
  • 举报
回复
去看MFC的消息映射里面怎么做跳转的
晨星 2005-09-10
  • 打赏
  • 举报
回复
嘿嘿,那就不知道了。想别的办法吧。
编译器似乎是没有这么个选项的。
  • 打赏
  • 举报
回复
函数指针就要多一次函数调用的成本哪, 不大合适哦。
晨星 2005-09-09
  • 打赏
  • 举报
回复
不是存标号,是存函数指针。
  • 打赏
  • 举报
回复
C/C++ 好像数组里不能存标号哦, 要做跳转表就要动汇编鸟, 麻烦哦.
晨星 2005-09-08
  • 打赏
  • 举报
回复
应该没有决定编译器具体实现算法的编译选项。
如果真的想用跳转表,为什么不干脆直接用跳转表来些程序呢?
jsjjms 2005-09-08
  • 打赏
  • 举报
回复
支持楼上,既然有这个想法,为什么一定要依靠编译器来做这些动作呢?

5,529

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧