新的Operator大幅增加了Arduino草图的大小-为什么

new-Operator increases Arduino sketch size drastically - why?

本文关键字:为什么 Arduino Operator 增加 新的      更新时间:2023-10-16

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

现在有人在讨论是使用new还是malloc(),但我没有发现草图尺寸大幅增加的迹象。

  • 所以,如果有人想解释这种巨大的增长是从哪里来的,那就太好了
  • 此外,如果有人知道simmilar的陷阱,你也很乐意分享;)

这里有一个用于检查自己的演示代码:

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] = ''; // 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,所以应该有一个更元的解释。

新运算符本质上是malloc的类型安全版本,旨在减少C++中的错误。你可以从这里的代码中看到,new实际上只是在添加了一些铃铛和口哨的情况下调用malloc。至于何时使用new与malloc,可以在这里找到一个很好的讨论,主要结论是几乎所有C++程序都应该使用new。话虽如此,由于不需要为基元类型调用构造函数(调用构造函数是新运算符的主要功能之一。此外,基元类型根本没有构造函数,因此编译器在搜索构造函数时可能会失去性能),因此不需要额外的铃声和口哨声来制作char数组。如果内存非常令人担忧,那么malloc是一个完全可以接受的解决方案。使用malloc的代码看起来非常好,应该可以更好地满足您的需要。

您混淆了几个部分。"IDE"是集成开发环境。这是一个GUI,它充当了一些工具的集成前端,包括编译器和链接器。此问题看起来像是链接器问题。

特别是,这看起来像是一个非常糟糕的编译器。它在大约60 kB内拖动,而应该在内拖动任何东西。类型安全应由编译器处理。在这里,编译器应该告诉编译器只使用malloc而不是new[],因为所有类型检查都通过了

你应该明白,Arduino是一个廉价的产品,工具并不是最先进的。