1. STL库中的string与原生char数组对比
在C++开发中,处理文本数据有两种主流方式:使用STL的string类或者传统的C风格char数组。string类实际上是char数组的高级封装,但提供了更安全、更方便的接口。我们先看一个典型场景:
cpp复制// 传统char数组方式
char oldSchool[20] = "Hello";
strcat(oldSchool, " World"); // 潜在缓冲区溢出风险
// STL string方式
std::string modern = "Hello";
modern += " World"; // 自动管理内存
string类的核心优势在于自动内存管理。当执行字符串连接操作时,传统char数组需要开发者手动确保目标缓冲区足够大,否则会导致缓冲区溢出。而string类会自动重新分配内存空间,完全避免了这类问题。
关键区别:string内部维护了capacity和size两个属性,当需要扩容时,通常会按当前大小的1.5-2倍增长(具体实现取决于标准库版本),这种策略在内存使用和性能之间取得了平衡。
2. stringplus版char数组的实现原理
所谓"stringplus版char数组",本质上是通过封装char数组,模拟string类的主要接口。我们来看一个简化实现:
cpp复制class CharArrayPlus {
private:
char* data;
size_t length;
size_t capacity;
void resize(size_t newCapacity) {
char* newData = new char[newCapacity];
memcpy(newData, data, length);
delete[] data;
data = newData;
capacity = newCapacity;
}
public:
CharArrayPlus() : data(new char[16]), length(0), capacity(16) {}
~CharArrayPlus() { delete[] data; }
void append(const char* str) {
size_t strLen = strlen(str);
if (length + strLen >= capacity) {
resize((length + strLen) * 2);
}
memcpy(data + length, str, strLen);
length += strLen;
}
const char* c_str() const {
data[length] = '\0';
return data;
}
};
这个实现有几个关键设计点:
- 采用动态扩容策略,初始分配16字节(与许多STL实现一致)
- 维护length和capacity,避免频繁重新分配
- 提供类似string的append接口
