字符串对象和以 null 结尾的字符数组之间的差异

Difference between String object and array of characters terminated with null

本文关键字:字符 数组 之间 结尾 对象 null 字符串      更新时间:2023-10-16

我正在使用Arduino。

对于文本操作,有两种方法。第一种方法是使用以 null 字符结尾的字符数组。这是用 C 语言完成的。另一种方法是使用用C++编写的 String 对象。

这两种方法有什么区别?使用 String 对象与字符数组的优缺点是什么?

我希望这个问题在像Arduino这样的嵌入式系统的上下文中得到回答。

与C++的std::string一样,Arduino String有几个优点:

  1. 它可以处理嵌入NUL字节('' (
  2. 计算长度是恒定时间(它是一个存储值,不是通过从头开始扫描NUL得出的(
  3. 使用过度分配策略,因此重复的就地连接更便宜;它不是准确地分配连接所需的内容,而是分配更多(取决于实现(,因此一堆小的串联最终不会为每个连接重新分配。
  4. 它还为您管理
  5. 许多分配任务,从而更容易避免缓冲区溢出(其中普通字符数组是固定大小,或者您手动管理动态分配的内存;无论哪种方式,溢出或内存泄漏的风险都会增加(

主要缺点是存储始终是动态分配的(堆栈本地字符数组可以减少内存碎片并提高缓存一致性(,并且您始终将Stringlengthcapacity存储在后台,因此您需要支付(取决于处理器的指针大小和类型的精确保证(12-24 字节的固定开销,超出了普通堆栈数组char所涉及的开销;如果你有很多非常小的String和有限的内存,这可能会伤害你(尽管对于很多来说,即使有char数组,你也可能是动态分配的,所以你仍然需要支付指针和分配器的开销,而不是lengthcapacity开销(。

从本质上讲,您使用String的原因与在普通C++中使用std::string的原因相同。