【发布时间】:2010-07-13 20:06:19
【问题描述】:
我有一个在嵌入式系统上运行的代码,它必须运行得非常快。我知道 C 和宏,这个特定的项目主要是用 C 编写的,但它也使用 C++ 模板 [越来越多]。有一个内联函数:
inline my_t read_memory(uint32 addr) {
#if (CURRENT_STATE & OPTIMIZE_BITMAP)
return readOptimized(addr);
#else
return MEMORY[addr];
#endif
}
此函数根据当前状态和指示是否在特定状态下使用优化的位图以优化方式或传统方式从内存中读取数据。
#define STATE_A 0x0001
#define STATE_B 0x0010
#define STATE_C 0x0100
#define STATE_D 0x1000
#define OPTIMIZE_BITMAP 0x1010 // optimize states d and b
在执行过程中(好的,编译),我尝试像这样重新定义 CURRENT_STATE:
int main(){
#define CURRENT_STATE STATE_A
do_a();
#undef CURRENT_STATE
#define CURRENT_STATE STATE_B
do_b();
....
}
所有 do_X() 函数都会调用 read_memory()。我无法使这种方法奏效。当我使用#warning 语句时,我可以看到当前状态的值始终是 STATE_A。这不是我的问题,尽管如果你能帮我解决这个问题,我会很高兴。所以,我的问题是,有没有办法使用模板而不是宏来做这种事情?
更多信息:我必须使用内联函数,因为我无法导出 MEMORY[],这是一个库函数。我真的不想修改函数原型(如 read_memory()...),但它会这样做。另外,请原谅我的晦涩。
非常感谢,
【问题讨论】:
-
为什么要使用模板来做到这一点?
-
这就是我可以想到的编译时决策,因为我不想在运行时做出决定。但我是开放的。
-
好的,是什么让您认为运行时决策太慢了?你有没有介绍过这样的事情?我们都希望我们的代码能够“非常快”地运行,并且 99.99% 的时间都可以做到这一点,而无需使用特殊的宏或模板。
-
这是 cuda 代码,我被告知要尽量减少 if 语句,但也许我必须先对其进行分析,谢谢
-
在下面的 cmets 中发现,perreal 正在编写一个库,而
do_X()函数实际上是用户提供的代码。
标签: c++ templates macros inline cuda