我希望这不是针对特定领域的。我想知道为什么 libc.a 使用我芯片上 8K 内存中的 1K。
除了调用 array_init 中全局对象的构造函数之外,我不知道使用 libc 的任何方式。据我所知,我认为它也参与了默认的副本构造。我使用池分配,因此没有与堆相关的东西(我确实使用了新的放置,但据我所知,这不应该导致 libc 使用 ram)。如果我完全忽略该库并使用placement new 作为 hack 来构造 main 中的所有全局对象,我的程序运行良好,这是 libc 使用的 1k 内存毫无用处的另一个暗示。谁能指出我进一步阅读或解释如何保留 array_init 和 POD 类型的默认复制构造,但摆脱 RAM 开销?
这是我的项目的 .map 文件中的违规条目:
*(vtable)
*(.data*)
.data._ZN3CDC4CoreI5MyCDCE11depInEmpty_E
0x10000000 0x1 ./src/Main.o
0x10000000 CDC::Core<MyCDC>::depInEmpty_
*fill* 0x10000001 0x3 00
.data.SystemFrequency
0x10000004 0x4 ./kvasir/system_LPC17xx.o
0x10000004 SystemFrequency
.data.impure_data
0x10000008 0x428 c:/nxp/lpcxpresso_5.2.4_2122/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libc.a(lib_a-impure.o)
.data 0x10000430 0x4 c:/nxp/lpcxpresso_5.2.4_2122/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/4.6.2/armv7-m\crtbegin.o
0x10000430 __dso_handle
0x10000434 . = ALIGN (0x4)
0x10000434 _edata = .
.jcr 0x10000434 0x0 load address 0x00003ee8
.jcr 0x10000434 0x0 c:/nxp/lpcxpresso_5.2.4_2122/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/4.6.2/armv7-m\crtbegin.o
.bss 0x10000434 0x1600 load address 0x00003ee8
0x10000434 _bss = .
*(.bss*)
.bss.inBuf 0x10000434 0x34 ./src/Main.o
0x10000434 inBuf
Run Code Online (Sandbox Code Playgroud)
更新
逐行检查我的代码后,我找到了一个修复程序,我在我的一个类中定义了一个空的析构函数
~MyClass(){}
Run Code Online (Sandbox Code Playgroud)
注释掉了 1K 的内存。谁能告诉我为什么?
在阅读了一些 newLib 代码后,在我看来,这是由加载一些多线程内容引起的。我通过不声明任何非默认析构函数解决了这个问题。我读到 newLib nano 可以解决这个问题,但我还没有测试,因为我的 IDE 还不支持它开箱即用。