char*vs cd中的std :: string

79 c++ arrays stl stdstring

std::string什么时候应该使用,什么时候应该char*用来管理charC++中的s 数组?

char*如果性能(速度)至关重要,并且由于内存管理,您愿意接受一些有风险的业务,那么您似乎应该使用它.

是否还有其他需要考虑的方案?

Sku*_*del 55

你可以通过引用传递std :: strings如果它们很大以避免复制,或者指向实例的指针,所以我没有看到使用char指针的任何真正优势.

我使用std :: string/wstring来获取或多或少的实际文本.char *虽然它对其他类型的数据很有用,但你可以确定它会像它应该的那样被释放.否则std :: vector是要走的路.

所有这些都可能有例外.

  • 两者之前有性能差异吗? (7认同)
  • 你确定吗?我知道许多操作都会假设char*是一个以空字符结尾的字符串,但我想不出任何假设std :: string不包含空字符的字符串. (6认同)
  • @ vtd-xml-author:有些可能.直``char*`几乎没有开销.究竟是什么开销`std :: string`我不知道,它可能是依赖于实现的.我几乎没有想到开销会比裸字符指针大得多.由于我没有标准副本,因此我无法详细说明标准所做的任何保证.任何性能差异可能会根据要进行的操作而有所不同.`std :: string :: size`可以存储字符数据旁边的大小,因此比`strlen`更快. (3认同)
  • 为什么不将std :: string用于非文本数据?它们不会被终止,所以你应该能够在那里存储任何你想要的东西. (2认同)

Gal*_*man 55

我的观点是:

  • 如果不调用"C"代码,切勿使用char*.
  • 总是使用std :: string:它更容易,它更友好,它是优化的,它的标准,它将防止你有bug,它已被检查并证明可以工作.


Sum*_*uma 13

原始字符串用法

是的,有时你真的可以做到这一点.当使用const char*,在堆栈上分配的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)


the*_*met 9

您必须使用一次char*,不std::string就是当你需要静态字符串常量.原因是您对订单模块没有任何控制来初始化它们的静态变量,而来自不同模块的另一个全局对象可能在它初始化之前引用您的字符串.http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Static_and_Global_Variables

std::string 优点:

  • 为你管理内存(字符串可以增长,实现将分配更大的缓冲区)
  • 更高级的编程接口,与STL的其余部分很好地配合.

std::string缺点: - 两个不同的STL字符串实例不能共享相同的底层缓冲区.因此,如果您通过值传递,您将始终获得一个新副本. - 有一些性能损失,但我会说除非你的要求是特殊的,否则它可以忽略不计.


Jér*_*ôme 8

您应该考虑char*在以下情况下使用:

  • 该数组将在参数中传递.
  • 您事先知道阵列的最大尺寸(您知道它还是强加它).
  • 您不会对此阵列进行任何转换.

实际上,在C++中,char*经常用于固定的小字,如选项,文件名等...

  • 数组未传递,指向数组的指针.这就是指针 - 指向对象的指针. (2认同)

use*_*637 5

何时使用c ++ std :: string:

  • 总的来说,字符串比char*更安全.通常当你使用char*做事情时,你必须检查事情以确保事情是正确的,在字符串类中,所有这些都是为你完成的.
  • 通常在使用char*时,你必须释放你分配的内存,你不必使用string,因为它会在被破坏时释放它的内部缓冲区.
  • 字符串与c ++ stringstream配合良好,格式化的IO非常简单.

何时使用char*

  • 使用char*可让您更好地控制场景"背后"发生的事情,这意味着您可以根据需要调整性能.


Nem*_*vic 5

如果您正在编写库,请使用 (const) char* 作为参数。不同编译器之间的 std::string 实现有所不同。