如何实现函数映射表?

RuntimeError 2012-04-20 12:38:45
最近我在设计一个芯片的模拟器,要实现一个指令到函数的映射。指令是一个16位整数(二进制)的,然后有两百多个函数。指令和函数有对应关系。现在我想做到的是,根据给出的指令,调用相应的函数。最直接的想法当然是用switch 和case,但这显然不是一个高效的方法。网上有提到“函数映射表”,但是我并没有找到具体的原理和实现。
或者换句话说,有没有别的高效率的方法来执行一个200个case的switch语句?
...全文
311 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
unituniverse2 2012-04-20
  • 打赏
  • 举报
回复
lz学一下动态重编译吧。现在这样的解释方式执行效率可能会很低。
qq120848369 2012-04-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 3 楼 的回复:
16位,就是65536大小的数组,直接下标1:1的映射。
typedef void (*ptr_func)();
ptr_func map_func[65536];

一个新的问题,如果我所定义的所有指令函数是类的成员函数,那么它们是否应该被定义成静态的呢?(我C++的一些概念掌握得不太好),取地址的时候要不要加&符号呢?
非常感谢!
[/Quote]

是的,需要定义为静态成员函数 或者 定义为全局函数并声明为类友元。
RuntimeError 2012-04-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
16位,就是65536大小的数组,直接下标1:1的映射。
typedef void (*ptr_func)();
ptr_func map_func[65536];
[/Quote]
一个新的问题,如果我所定义的所有指令函数是类的成员函数,那么它们是否应该被定义成静态的呢?(我C++的一些概念掌握得不太好),取地址的时候要不要加&符号呢?
非常感谢!
evencoming 2012-04-20
  • 打赏
  • 举报
回复
一个查询的key,函数指针为value
直接一个所有函数数目的指针数组。
按key查询。
如果不方便表示连续的,就排序,二分查找,也花不了多少时间。
qq120848369 2012-04-20
  • 打赏
  • 举报
回复
如果你有n:1,1:n的情况,那么相应做好数据结构的调整即可,问题变成了:

"main.c" 32L, 499C written
[User:root Time:13:55:26 Path:/home/liangdong/c]$ gcc -o main main.c
[User:root Time:13:55:27 Path:/home/liangdong/c]$ ./main
func1
func2
[User:root Time:13:55:28 Path:/home/liangdong/c]$ cat main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef void (*ptr_func)();
typedef ptr_func *arr_ptr_func;

void test_func1() {
printf("func1\n");
}
void test_func2() {
printf("func2\n");
}

int main(int argc, char* argv[]) {
arr_ptr_func map[65536];

map[5] = (arr_ptr_func)malloc(sizeof(ptr_func) * 3);
map[5][0] = test_func1;
map[5][1] = test_func2;
map[5][2] = NULL;

int ndx = 5;
arr_ptr_func ptr = map[5];

while (*ptr != NULL) {
(*ptr)();
++ ptr;
}

return 0;
}


自己做好插入删除的函数封装即可无线扩展。
曾经的梦 2012-04-20
  • 打赏
  • 举报
回复
貌似见过,不过记不得了
qq120848369 2012-04-20
  • 打赏
  • 举报
回复
16位,就是65536大小的数组,直接下标1:1的映射。

typedef void (*ptr_func)();
ptr_func map_func[65536];
帅得不敢出门 2012-04-20
  • 打赏
  • 举报
回复
简单的二维数组也是可行的,以指令从小到大的顺序排,
查找的时候用二分。
www_adintr_com 2012-04-20
  • 打赏
  • 举报
回复
用 hash 表,指令作为 Key, 函数指针作为值

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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