Arduino环境下不使用std::vector创建对象数组的方案分析
Arduino无std::vector下的LED分段对象实现方案分析与选择
我在为Arduino编写代码,由于Arduino不支持std::vector,从未使用过该容器。现在需要实现分段可自定义的LED灯带,每一段用独立对象表示,固定最大分段数即可,无需动态数组。
我总结了三种实现方式,以下用Test类演示:
#include<iostream> using namespace std; class Test { private: int var = 0; public: Test () {} Test(int input) { var = input; } ~Test() { cout << "Instance with var = " << var << " deleted" << endl; } void printTest() { cout << "var = " << var << endl; } };
方案1:用new填充指针数组
int main() { int maxTest = 10; Test* test[maxTest]; test[0] = new Test(10); test[0]->printTest(); delete test[0]; return 0; }
输出:
var = 10 Instance with var = 10 deleted
该方案是多数人推荐的标准方式,但无法使用delete[],需逐个删除实例;未初始化的指针执行delete会导致程序崩溃,因此需要单独跟踪已创建对象的位置和数量。
方案2:用new初始化数组
int main() { int maxTest = 10; Test* test = new Test[maxTest]; test[0] = Test(10); test[0].printTest(); delete[] test; return 0; }
输出:
Instance with var = 10 deleted var = 10 Instance with var = 0 deleted Instance with var = 0 deleted Instance with var = 0 deleted Instance with var = 0 deleted Instance with var = 0 deleted Instance with var = 0 deleted Instance with var = 0 deleted Instance with var = 0 deleted Instance with var = 0 deleted Instance with var = 10 deleted
该方案较为常见,但赋值时会先调用析构函数,且始终存在maxTest个实例,效率较低;同时存在疑问:为何第一个析构实例的var值为10而非0?
方案3:直接创建栈上数组
int main() { int maxTest = 10; Test test[maxTest]; test[0] = Test(10); test[0].printTest(); return 0; }
输出与方案2相同。存在疑问:为何该方案少见?在Arduino这类封闭系统中,栈内存足够时是否可行?
请问是否有其他实用的实现方式?该如何选择及原因?
内容的提问来源于stack exchange,提问作者Morten360
相关产品推荐
相关产品推荐

