字符串对象和以 null 结尾的字符数组之间的差异
Difference between String object and array of characters terminated with null
我正在使用Arduino。
对于文本操作,有两种方法。第一种方法是使用以 null 字符结尾的字符数组。这是用 C 语言完成的。另一种方法是使用用C++编写的 String 对象。
这两种方法有什么区别?使用 String 对象与字符数组的优缺点是什么?
我希望这个问题在像Arduino这样的嵌入式系统的上下文中得到回答。
与C++的std::string
一样,Arduino String
有几个优点:
- 它可以处理嵌入
NUL
字节(' '
( - 计算长度是恒定时间(它是一个存储值,不是通过从头开始扫描
NUL
得出的(
它 - 使用过度分配策略,因此重复的就地连接更便宜;它不是准确地分配连接所需的内容,而是分配更多(取决于实现(,因此一堆小的串联最终不会为每个连接重新分配。 它还为您管理
- 许多分配任务,从而更容易避免缓冲区溢出(其中普通字符数组是固定大小,或者您手动管理动态分配的内存;无论哪种方式,溢出或内存泄漏的风险都会增加(
主要缺点是存储始终是动态分配的(堆栈本地字符数组可以减少内存碎片并提高缓存一致性(,并且您始终将String
的length
和capacity
存储在后台,因此您需要支付(取决于处理器的指针大小和类型的精确保证(12-24 字节的固定开销,超出了普通堆栈数组char
所涉及的开销;如果你有很多非常小的String
和有限的内存,这可能会伤害你(尽管对于很多来说,即使有char
数组,你也可能是动态分配的,所以你仍然需要支付指针和分配器的开销,而不是length
和capacity
开销(。
从本质上讲,您使用String
的原因与在普通C++中使用std::string
的原因相同。
相关文章:
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- 字符数组中的元素数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 使用字符数组作为 Map 中的键
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 按顺序声明的字符数组重叠
- 在 C++ 中字符串的大小与字符数组的大小
- 寻找一种更好的方法来表示无符号字符数组
- 如何打印 2D 字符数组C++
- 从字符数组的元素中减去'a'是什么意思
- 我是否不正确地集中了这些字符数组?