gpt4 book ai didi

c++ - 声明一个函数 virtual 会减慢它的速度;备择方案?

转载 作者:行者123 更新时间:2023-11-30 01:17:48 25 4
gpt4 key购买 nike

我有一个名为 WorkerA 的类,它适用于一种图像格式(我们就称它为 A,它相当不标准)。该类(class)一直运行良好:

class WorkerA
{
public:
void Setup()
{
//some stuff specific to format A
}

void MainTask()
{
//some algorithm that calls GetPixel() a lot
}
//...

protected:
int GetPixel(int x, int y)
{
int value;
//value = ... (gets pixel value in format A)
return value;
}

unsigned char * pBitmapA;
//...
};

现在我需要另一个适用于图像格式 B 的类。MainTask 和一些其他函数与 WorkerA 相同,但其余函数需要不同的实现。不确定这种情况下的最佳实践,我拼凑了如下内容:

class WorkerB : public WorkerA
{
public:
void Setup()
{
//some stuff specific to format B
}
//... (other functions. MainTask not re-implemented.)

protected:
virtual int GetPixel(int x, int y)
{
int value;
//value = ... (gets pixel value in format B)
return value;
}

unsigned char ** pBitmapB; //different format than pBitmapA
};

至此,我还使 WorkerA::GetPixel 成为虚拟的,以便在调用 WorkerB::MainTask 时获得正确的多态行为。但是,这一更改导致 WorkerA::MainTask 的运行时间比以前长 50%——这是我真正需要避免的。

我的问题是:我应该如何重新安排这 2 个类,以便尽可能少地重复代码,而不会降低速度?如果需要,我可以完全重写 WorkerA 和 WorkerB(尽管我最好保留 WorkerA 的现有界面),但我无法更改图像格式。

最佳答案

通常,任何调用每个像素的成像代码都会很慢。如果可以,请重构代码,使其适用于更大的 block ,一次可能是一条光栅线。

如果您可以在编译时而非运行时确定要使用哪个类,则可以使用 Curiously Recurring Template Pattern (CRTP)消除虚拟调用的开销。

关于c++ - 声明一个函数 virtual 会减慢它的速度;备择方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23610746/

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