新的Operator大幅增加了Arduino草图的大小-为什么
new-Operator increases Arduino sketch size drastically - why?
在将部分代码重新构造为类时,我选择将静态大小的数组更改为动态数组,并对草图的大小感到震惊,它增加了~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是一个廉价的产品,工具并不是最先进的。
- 为什么我的 arduino 按钮在 0 和 1 以外的端口上不起作用?
- 为什么我们在 Arduino 中有两个 if 语句?
- 我的Arduino串行命令行不起作用,我不知道为什么
- 为什么我的Arduino代码用于运行蓝牙控制的机器人,障碍物传感器无法正常工作
- Arduino Nano - 为什么我的引脚表现得如此?
- 为什么Arduino对Mega 2560和ESP8266的角色指针处理有两种不同的行为
- 为什么Arduino(小端序)上的Sha1在没有转换为大端序的情况下工作?
- 为什么我的串行串行在Arduino IDE上通过串行显示器进行两次打印
- 无法弄清楚为什么这个Arduino代码不起作用?
- 如何调试为什么Arduino会中断while循环
- 为什么我的 Arduino 不能比较 10 以上?
- 为什么free()没有释放我的Arduino Uno上的RAM
- 为什么这两个值在 arduino 上不相等
- 为什么Arduino在进入初始化功能之前会重新启动
- 新的Operator大幅增加了Arduino草图的大小-为什么
- C++递减单字节(易失性)数组的元素不是原子!为什么?(还有:如何在Atmel AVR mcus/Arduino中强制原
- 为什么全局对象构造函数只打印 Arduino 中的前 2 个字符
- 为什么 Arduino Micro(USB 设备)的供应商 ID 和产品 ID 在 Linux 和 Windows 中有所不同?
- 为什么我不能在 Arduino 中传递 typedef 或枚举?
- 为什么arduino忽略了一个函数调用