gpt4 book ai didi

c++ - 在减少模板使用的同时优化性能

转载 作者:太空宇宙 更新时间:2023-11-04 14:09:36 26 4
gpt4 key购买 nike

在我的应用程序中,通过为结构体引入特殊情况,我的速度提高了大约 2 倍。

简化后,我的代码如下所示:

class SpecialCase
{
private:
size_t values[10];
public:
void foo();
};

class GenericCase
{
private:
std::vector<size_t> values;
public:
void foo();
};

template <class Case> void bar()
{
Case case;
case.foo();
}

void somewhereElse()
{
if ( boring_runtime_condition )
{
bar<SpecialCase>();
}
else
{
bar<GenericCase>();
}
}

这段代码没有问题,但现在我必须通过另一个类来扩展应用程序:

class Problem
{
private:
std::vector<Case> cases;
public:
Case doSomething();
};

要同时使用 SpecialCase 和 GenericCase,我必须让整个类成为一个模板。由于我有几个特殊情况,这大大减慢了编译速度。我一点也不喜欢这样。

我从不在应用程序的运行中混合使用 SpecialCase 和 GenericCase。我非常希望不必将我的 Case 转换为特定类型在每个方法中,因为它会使代码膨胀并且其他开发人员可能会忘记它。

有没有什么好的方法可以避免这种模板问题? (也欢迎使用 C++11 解决方案)

免责声明:请不要告诉我 std::vector 有多棒以及我不应该使用特殊情况。我测量了性能,所以请不要留下您不相信 2 倍加速的评论。这是事实,这个问题不是关于它的。

最佳答案

如果你不想创建很多 std::vector 的实例,您可以制作一个小型代理类,通过引用存储所有内容,并仅在此类中强制转换。如果它很小,实例化不会太慢。

template<class T>
class Problem {
private:
std::vector< some_smart_pointer > cases;
public:
T cast(Case* x) {
return (T*)x;
}
T doSomething() {
//doing something
return cast(returnValue);
}
};

我给类(class)打了电话Problem , 但最好做一些其他层 ProxyVector仅用作代理并在 Problem 中使用它

关于c++ - 在减少模板使用的同时优化性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15309965/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com