在将我的部分代码重新编写到类中时,我选择将静态大小的数组更改为动态数组,并对我的草图大小感到震惊,增加了~579%!
现在有一些关于使用new
或malloc()
的讨论,但我没有发现草图大小的大幅增加。
以下是检查自己的演示代码:
void setup() {
// put your setup code here, to run once:
#define BUFLEN 8 * sizeof(char)
#define BUFVAL '5'
#define BUFARR {BUFVAL,BUFVAL,BUFVAL,BUFVAL,BUFVAL,BUFVAL,BUFVAL,BUFVAL,0}
#define MODE 2
int i = 0;
Serial.begin(115200);
#if (MODE == 0)
//10.772 Bytes for an Arduino Due on IDE 1.57 -> 2% of total
char empty_page[BUFLEN+1] = BUFARR;
#elif (MODE == 1)
//12.772 Bytes for an Arduino Due on IDE 1.57 -> 2% of total, ~18.5% increase
char *empty_page = (char *)malloc(BUFLEN+1);
memset(empty_page, BUFVAL, BUFLEN);
empty_page[BUFLEN+1] = '\0'; // NULL Terminate
#elif (MODE == 2)
//73.152 Bytes for an Arduino Due on IDE 1.57 -> 13% of total, ~579% increase
char *empty_page = new char[BUFLEN+1]BUFARR;
#endif
Serial.println("Result: ");
for(i=0; i<BUFLEN; i++) {
Serial.print(empty_page[i]);
}
Serial.println("");
#if (MODE == 1)
free(empty_page);
#elif (MODE == 2)
delete[] empty_page;
#endif
}
void loop() {
// put your main code here, to run repeatedly:
}
要在没有arduino的情况下检查此代码:http://ideone.com/e.js/bMVi0d
编辑:
我的理解是,new
引导IDE编译一些大的c ++内容以便处理它。另一方面,IDE的详细编译器输出是相同的。
我正在努力减少我的草图,任何有这个目标的人肯定会对像你需要避免的“新”这样的部分感兴趣,以便获得更小的草图。这似乎是一个普遍的Arduino IDE的东西,所以应该有更多的meta解释。
答案 0 :(得分:0)
new运算符本质上是malloc的类型安全版本,旨在减少C ++中的错误。你可以从代码here看到新实际上只是调用了malloc并添加了一些铃铛和口哨声。至于何时使用new vs malloc,可以找到一个很好的讨论here,主要结论是几乎所有的C ++程序都应该使用new。话虽这么说,你不需要额外的花里胡哨来制作一个char数组,因为你不需要为原始类型调用构造函数(调用构造函数是new运算符的主要功能之一。请注意,原始类型根本没有构造函数,因此编译器可能会丢失性能搜索一个)。如果内存是可怕的,malloc是一个完全可以接受的解决方案。使用malloc的代码看起来非常好,应该更适合您的目的。
答案 1 :(得分:0)
你困惑了几个部分。 “IDE”是集成开发环境。这是一个GUI,它作为一些工具的集成前端,包括编译器和链接器。此问题看起来像链接器问题。
特别是,这看起来像一个非常糟糕的编译器。它拖动大约60 kB,而它应该拖入 nothing 。类型安全应由编译器处理。在这里,编译器应该告诉编译器只使用malloc
而不是new[]
,因为所有类型检查都通过了。
你应该明白Arduino是一种廉价产品,而且工具并不是最先进的。