在C++中管理字符数组时,何时应使用std::string
,何时应使用char*
?
如果性能(速度)至关重要且你愿意因内存管理而承担一定的风险,那么似乎应该使用char*
。
还有其他需要考虑的情况吗?
如果 std::string
很大,为避免复制,可以通过引用或实例的指针传递,因此我认为使用 char
指针没有什么优势。
对于任何实际文本,我都使用 std::string
/ wstring
。但是 char *
对于其他类型的数据很有用,并且您可以确保它像应该一样被释放。否则,std::vector<char>
是最好的选择。
所有这些可能都有例外情况。
我的观点是:
是的,有时确实可以这样做。当使用const char *、在栈上分配的char数组和字符串字面量时,你可以以一种不需要任何内存分配的方式来完成。
编写这样的代码通常需要比使用string或vector更多的思考和关注,但是通过适当的技术,它是可以完成的。使用适当的技术,代码可以很安全,但你总是需要确保在将字符复制到char []中时,你要么对要复制的字符串长度有一些保证,要么检查并优雅地处理过长的字符串。不这样做就是给strcpy函数族带来不安全声誉的原因。
至于char []缓冲区的安全性,模板可以帮助解决问题,因为它们可以为你创建一个封装来处理缓冲区大小。例如,微软已经实现了此类模板,以提供strcpy的安全替代品。以下示例摘自我的代码,实际代码具有更多方法,但这应该足以传达基本思想:
template <int Size>
class BString
{
char _data[Size];
public:
BString()
{
_data[0]=0;
// note: last character will always stay zero
// if not, overflow occurred
// all constructors should contain last element initialization
// so that it can be verified during destruction
_data[Size-1]=0;
}
const BString &operator = (const char *src)
{
strncpy(_data,src,Size-1);
return *this;
}
operator const char *() const {return _data;}
};
//! overloads that make conversion of C code easier
template <int Size>
inline const BString<Size> & strcpy(BString<Size> &dst, const char *src)
{
return dst = src;
}
char*
类型的字符串并不总是在堆栈中。 char *str = (char*)malloc(1024); str[1024] = 0;
- Cole Tobinchar*
而不是std::string
的一个场景是需要使用静态字符串常量。原因是您无法控制模块初始化其静态变量的顺序,而来自另一个模块的另一个全局对象可能会在初始化之前引用您的字符串。http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Static_and_Global_Variables
std::string
优点:
std::string
缺点:
在以下情况下,您应该考虑使用 char*
:
实际上,在C++中,char*
经常用于固定长度的小单词,如选项、文件名等。
何时使用C++的std::string:
string
比char*
更安全。通常情况下,当您使用char*
时,您需要检查各种事情以确保正确性,但在string
类中,所有这些都已为您完成。char*
时,您需要释放您分配的内存,但在string
中,它会在析构时自动释放其内部缓冲区。string
与C++的stringstream
结合使用非常好,格式化IO非常容易。何时使用char*:
char*
可以让您对“幕后”发生的事情更加掌控,这意味着如果需要,您可以调整性能。如果你在编写一个库,使用(const) char*作为参数。因为std::string实现在不同的编译器之间是有差异的。
如果您想使用C库,您需要处理C字符串。同样的情况也适用于您想将API公开给C。
如果您正在使用类似文本等的字符数组,请使用std :: string更灵活,更易于使用。 如果您将其用于其他内容(如数据存储)? 请使用数组(首选向量)
char *
几乎没有额外的开销。std::string
具体有多大的开销我不确定,这可能取决于具体实现。我很难想象其开销会比裸指针更大。由于我没有标准库的副本,因此无法详细说明标准所做的任何保证。性能差异可能会因要执行的操作而异。std::string::size
可以将大小存储在字符数据旁边,因此比strlen
更快。 - Skurmedelappend(const string&)
和append(const char*, size_t)
而不是operator+=()
。 - boycy