我std::string
什么时候应该使用,什么时候应该char*
用来管理char
C++中的s 数组?
char*
如果性能(速度)至关重要,并且由于内存管理,您愿意接受一些有风险的业务,那么您似乎应该使用它.
是否还有其他需要考虑的方案?
Sku*_*del 55
你可以通过引用传递std :: strings如果它们很大以避免复制,或者指向实例的指针,所以我没有看到使用char指针的任何真正优势.
我使用std :: string/wstring来获取或多或少的实际文本.char *
虽然它对其他类型的数据很有用,但你可以确定它会像它应该的那样被释放.否则std :: vector是要走的路.
所有这些都可能有例外.
Gal*_*man 55
我的观点是:
Sum*_*uma 13
是的,有时你真的可以做到这一点.当使用const char*,在堆栈上分配的char数组和字符串文字时,你可以这样做,根本没有内存分配.
编写此类代码通常需要比使用字符串或向量更多的思考和关注,但使用适当的技术可以完成.使用适当的技术,代码可以是安全的,但是您总是需要确保在复制到char []时,您要么对要复制的字符串的长度有一些保证,要么优雅地检查和处理超大字符串.不这样做是因为这些功能系列的功能不安全.
至于char []缓冲区的安全性,模板可以提供帮助,因为它们可以创建一个封装来为您处理缓冲区大小.像这样的模板是由Microsoft实现的,以便为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;
}
Run Code Online (Sandbox Code Playgroud)
您必须使用一次char*
,不std::string
就是当你需要静态字符串常量.原因是您对订单模块没有任何控制来初始化它们的静态变量,而来自不同模块的另一个全局对象可能在它初始化之前引用您的字符串.http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Static_and_Global_Variables
std::string
优点:
std::string
缺点: - 两个不同的STL字符串实例不能共享相同的底层缓冲区.因此,如果您通过值传递,您将始终获得一个新副本. - 有一些性能损失,但我会说除非你的要求是特殊的,否则它可以忽略不计.
您应该考虑char*
在以下情况下使用:
实际上,在C++中,char*
经常用于固定的小字,如选项,文件名等...
何时使用c ++ std :: string:
何时使用char*