use*_*739 8 c++ templates coding-style arduino
在与微控制器编程(Arduino)联系时,我看到以下类控制特定引脚上的LED:
template <const uint8_t PIN>
class LED
{
public:
LED()
{
pinMode(PIN, OUTPUT);
}
void turnOn()
{
digitalWrite(PIN, HIGH);
}
void turnOff()
{
digitalWrite(PIN, LOW);
}
};
Run Code Online (Sandbox Code Playgroud)
我可以通过它来使用它
LED<8> led;
led.turnOn();
Run Code Online (Sandbox Code Playgroud)
点亮引脚8上的LED.
但我问自己:为什么将引脚作为模板参数给出,为什么不作为实例属性?头等舱比这个好处有什么好处?
class LED
{
public:
LED(uint8_t ledPin) : pin(ledPin)
{
pinMode(pin, OUTPUT);
}
void turnOn()
{
digitalWrite(pin, HIGH);
}
void turnOff()
{
digitalWrite(pin, LOW);
}
private:
uint8_t pin;
};
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
LED led(8);
led.turnOn();
Run Code Online (Sandbox Code Playgroud)
在第二节使用头等舱是否有优势,或者这仅仅是品味问题?:)
小智 10
"在第二节使用头等舱是否有优势,或者仅仅是品味问题?:)"
是.在模板的情况下,编译器可以直接使用数值,而无需存储保存两个内存的变量(该数字必须存储在非模板情况下的RAM中)和电源(您需要将字节保存到的指令)内存,然后加载到寄存器而不是直接加载到寄存器).
在普通PC的情况下保存都非常小,这确实无关紧要,但是对于低RAM(低于1MB)的小型设备(如微控制器)和慢速CPU,每个字节都很重要.
但是,如果您将模板用于更多引脚(具有不同的数字),则您的应用程序将包含多种方法,用于打开和关闭(对于每个使用的引脚编号)增加可执行文件的大小.在这种情况下,您为应用程序节省了内存以获取数据和CPU功耗,而这取决于您需要的内容 - 较小的应用程序具有较大的内存和CPU功率开销,反之亦然.