gpt4 book ai didi

c++ - 如何使用常量私有(private)变量优化类成员?

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:05 25 4
gpt4 key购买 nike

我正在研究一些对空间和性能优化至关重要的嵌入式设备库。

每个设备都需要一些恒定的校准系数:

  • 有时可以在编译时设置
  • 有时需要通过与设备对话来动态获取

当可以在编译时设置校准系数时,理论上可以大大优化类成员方法,因为许多计算都是用常量进行的。

当我可以用两种方式实例化类时,我想做一个类设计:

  • 利用编译时间系数和优化方法。
  • 或使用动态确定的系数和通用方法。

如果有帮助的话,因为类是单例,我类的所有成员都可以声明为静态的。

但我也很好奇如何对多个实例执行此操作,其中具有编译时间常量的实例分别使用一些特定的优化编译方法。

实际上是这样使用的:

struct CalibrationCoeff {
uint8_t calA[12];
uint16_t calB;
double calC[10];
};

const CalibrationCoeff defaultCoeffs = { ... values ... };

class MyDevice {

public:
MyDevice(CalibrationCoeff calCoeff = defaultCoeffs) : calCoeff(calCoeff) { }

double complexComputation(double input1, double input2);

private:
const CalibrationCoeff calCoeff;
};

然后我像这样实例化我的类:

const CalibrationCoeff compileTimeCoeff = { ... values ...; }

MyDevice device(compileTimeCoeff);

但是我面临着两个问题:

  • 我不确定编译器是否看到该类只用常量声明了一次,所以方法可以用那里的常量进行优化。

  • 我不能将此类与动态系数一起使用,因为如果我使用默认系数声明该类,我以后将无法更改它们,因为它们是 const

如果系数未在类中声明为 const,我不确定编译器是否会通过看到 compileTimeCoeff 声明为 const 来进行优化(出于某种原因,我需要在编译时实例化该类)。

有什么想法吗?即使所有成员都声明为 static,我也看不到解决方案。

问候。

更深入搜索后的一些精度:

当一个类在单独的模块中定义时,如 device.h 和 device.cpp,该模块是单独构建的。因此,编译器不可能使用 constconstexpr 变量来优化类的方法,因为在编译时不知道变量的值。

因此,似乎编译具有特定值优化的类方法的唯一解决方案是使用模板

但即使 constexpr 现在在 c++ 标准中,似乎仍然不允许使用 constexpr 变量作为模板非类型参数。

此功能 is proposed用于下一个标准,但目前不允许。

因此,如果我理解得很好,要创建一些具有优化方法的特定类,唯一的方法就是使用。但是我失去了类型安全....

有人可以向我证实这一点或给我另一个想法......

最佳答案

看起来 const 不足以优化所有这些。幸运的是,我们 constexpr 强制编译时优化。

在下面的示例中,我在需要的地方添加了 constexpr(您可能可以使用更少的 const,这在某些地方是隐含的)

#include <cstdint>

struct CalibrationCoeff {
int calA[2];
int calB;
double calC[2];
};

constexpr static const CalibrationCoeff defaultCoeffs = {{10, 20}, 30, {40.,50.}};

class MyDevice {

public:
constexpr MyDevice(CalibrationCoeff calCoeffArg = defaultCoeffs) : calCoeff(calCoeffArg) { }

int complexComputation(int input);

private:
const CalibrationCoeff calCoeff;
};

int MyDevice::complexComputation(int input) {

return input * calCoeff.calA[1] - input * calCoeff.calA[0];
}


static const CalibrationCoeff compileTimeCoeff = {{1,2},30,{40.0,50.0}};
static MyDevice device(compileTimeCoeff);

int main(int argc, char** argv)
{
int ret = device.complexComputation(argc);
return ret;
}

Compiler Explorer

给出以下程序集:

MyDevice::complexComputation(int):
mov eax, DWORD PTR [rdi+4]
imul eax, esi
imul esi, DWORD PTR [rdi]
sub eax, esi
ret
main:
mov eax, edi
ret

我还为 complexComputation(和 const)+ compileTimeCoeff 和设备添加了 constexpr。有了这个,我什至在代码大小方面得到了更好的结果。不再需要函数指针,因为函数现在是隐式内联的:

main:
mov eax, edi
ret

Compiler Explorer

关于c++ - 如何使用常量私有(private)变量优化类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54256458/

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