使用类模板参数而不是使用实例变量有什么好处?

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功率开销,反之亦然.