new-Operator大大增加了Arduino草图的大小 - 为什么?

时间:2015-02-22 04:21:56

标签: c++ c arduino

在将我的部分代码重新编写到类中时,我选择将静态大小的数组更改为动态数组,并对我的草图大小感到震惊,增加了~579%!

现在有一些关于使用newmalloc()的讨论,但我没有发现草图大小的大幅增加。

  • 所以,如果有人想解释这个巨大的增长来自哪里,那就太棒了!
  • 此外,如果有人知道相似的陷阱,那么分享是非常好的;)

以下是检查自己的演示代码:

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解释。

2 个答案:

答案 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是一种廉价产品,而且工具并不是最先进的。