它基本上取决于您的编译器和您拥有的内存量。如果您有超过Kb的内存,那么动态分配内存会很有帮助。如果没有将标准库中的malloc实现调整为适合您的内存大小,则可以编写自己的内存,或者周围有不错的示例,例如Ralph Hempel的mm_malloc,可用于在顶部编写new和delete运算符。
我不同意那些重复的说法,即异常和stl容器太慢或太过膨胀等模因。当然,它比简单的C的malloc添加了更多的代码,但是明智地使用异常可以使代码更加清晰明了。避免太多错误检查C中的blur。
必须记住,STL分配器将以2的幂数增加其分配,这意味着有时它会进行一些重新分配,直到达到正确的大小为止,您可以通过保留来防止它重新分配,因此它变得与所需的一个malloc一样便宜。如果您知道要分配的大小,则选择size。
例如,如果向量中有很大的缓冲区,则在某个时候它可能会进行重新分配,并最终在重新分配和移动数据时消耗您打算使用的内存大小的1.5倍。(例如,在某个时刻分配了N个字节,您可以通过append或插入迭代器添加数据,并且分配2N字节,复制前N个并释放N。在某个时刻分配了3N个字节)。
因此,最终它具有很多优势,而且如果您知道自己在做什么,就会付出很多。您应该对C ++如何在嵌入式项目上使用它毫不意外地有所了解。
对于固定缓冲区并进行重置的人,您始终可以在new运算符内部进行重置,或者如果内存不足,则可以进行重置,但这意味着您设计不当会耗尽内存。
ARM realview 3.1引发异常:
--- OSD\
S:218E72F0 E1A00000 MOV r0,r0
S:218E72F4 E58D0004 STR r0,[sp,
S:218E72F8 E1A02000 MOV r2,r0
S:218E72FC E24F109C ADR r1,{pc}-0x94 ; 0x218e7268
S:218E7300 E28D0010 ADD r0,sp,
S:218E7304 FA0621E3 BLX _ZNSsC1EPKcRKSaIcE <0x21a6fa98>
S:218E7308 E1A0B000 MOV r11,r0
S:218E730C E1A0200A MOV r2,r10
S:218E7310 E1A01000 MOV r1,r0
S:218E7314 E28D0014 ADD r0,sp,
S:218E7318 EB05C35F BL fapi_error::fapi_error <0x21a5809c>
S:218E731C E3A00008 MOV r0,
S:218E7320 FA056C58 BLX __cxa_allocate_exception <0x21a42488>
S:218E7324 E58D0008 STR r0,[sp,
S:218E7328 E28D1014 ADD r1,sp,
S:218E732C EB05C340 BL _ZN10fapi_errorC1ERKS_ <0x21a58034>
S:218E7330 E58D0008 STR r0,[sp,
S:218E7334 E28D0014 ADD r0,sp,
S:218E7338 EB05C36E BL _ZN10fapi_errorD1Ev <0x21a580f8>
S:218E733C E51F2F98 LDR r2,0x218e63ac <OSD\
S:218E7340 E51F1F98 LDR r1,0x218e63b0 <OSD\
S:218E7344 E59D0008 LDR r0,[sp,
S:218E7348 FB056D05 BLX __cxa_throw <0x21a42766>
看起来并不那么可怕,并且如果未引发异常,则{}块或函数内不会添加任何开销。