【发布时间】:2011-06-28 15:51:21
【问题描述】:
我有一个性能关键的内联函数。它根据参数生成一些数据。我希望编译器优化所有调用的数据生成,其中参数在编译时是已知的。问题是我不能强制编译器将优化后的数据从堆栈中放入静态常量,因为标记数据static 会破坏参数不是编译时常量的情况。在堆栈上拥有不变的数据会损害性能。有没有办法推断(可能使用模板/boost::enable_if),参数是编译时常量并选择数据生成的适当实现?
澄清
基本上我有以下内容:
struct Data {
int d_[16];
};
inline Data fun(int param)
{ //param can sometimes be a compile-time constant
... //generate the data
Data res = {gen0, gen2, gen3, ..., gen15}; //put the data into result
return res;
}
所以当param 不是编译时常量时,我们只是生成所有数据并返回。
当param 已知时,编译器可以优化数据生成。但随后它未能优化以下行并生成大量代码,只是将res 成员设置为已知数据(数据嵌入到程序代码中)。我希望编译器创建一个静态常量,然后将其复制到返回对象(这比使用嵌入数据执行大量代码要快)。由于这是一个内联函数,因此甚至可能不需要复制。
免责声明
这个问题和How to use different overload of an inline function, depending on a compile time parameter?不一样。这是一个更普遍的问题。
【问题讨论】:
-
我不认为有办法检测函数参数是否是编译时间常数,我不明白你为什么重命名旧问题,所以标题与问题相矛盾并开始了一个新问题一个在这个。
-
不,新标题与问题不矛盾。我在编辑中错误地表达了自己,直到现在才意识到这一点。谢谢!
标签: c++ static constants inline