当我应该使用 std::string 当我应该使用 char* 管理阵列 chars在C++?

它似乎应该使用 char* 如果性能(速度)是至关重要的,你愿意接受一些有风险的业务,因为存管理。

是否还有其他方案,以考虑?

有帮助吗?

解决方案

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

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

所有这些都可能有例外。

其他提示

我的观点是:

  • 从来没有使用char*如果你不叫"C"代码。
  • 总是使用std::string:这是更加容易,这是更加友好,它的优化,这是标准,它会阻止你有错误,它已经检查并证明工作。

原始字符串用法

是的,有时你真的可以做到这一点。当使用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;
}

有一次,你必须使用 char* 而不 std::string 是的,当你需要静string constants.其中的原因是,你没有任何控制订单上的模块化他们的静态变量,而另一个全球对象,从一个不同的模块可以指给你串在它之前的初始化。 http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Static_and_Global_Variables

std::string 赞成:

  • 管理忆(串可以生长和执行将分配较大的缓冲你)
  • 高级程序设计的接口,作品很好的休息 为STL。

std::string 缺点:-两个不同的STL串的实例不能共享相同的基础缓冲区。所以如果你通过你值始终得到一个新的副本。-有一些性能的惩罚,但是我想说除非你的要求,特别是可以忽略不计。

你应该考虑使用 char* 在下列情况下:

  • 这一系列将通过在参数。
  • 你事先知道最大的阵列(你知道的或者你的意志强加给它)。
  • 你不会做任何的转变在这一阵列。

实际上,在C++ char* 常常使用固定字,作为选项,文件名称、等等。

当使用c++std::string:

  • 串的、整体的、更安全的比char*,通常,当你正在做的事情与char*你要检查的东西,以确保事情是正确的,在串级的所有这一切都是为你做的。
  • 通常当使用char*,你会有免费存储你分配,你没有做到这一串因为它会释其内部缓冲区时毁灭。
  • 串的工作以及与c++stringstream,格式IO是很容易的。

当使用char*

  • 使用char*给你更多的控制权发生了什么事"后面的",这意味着你可以为你的表现如果你需要。

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

如果你想使用C库,你将不得不处理C字符串。如果您想将API公开给C,则同样适用。

您可以期望std :: string上的大多数操作(例如find)尽可能优化,因此它们可能至少与纯C对应的操作一样好。

值得注意的是,std :: string迭代器经常映射到指向底层char数组的指针。因此,您在迭代器之上设计的任何算法在性能方面基本上与char *之上的相同算法相同。

需要注意的事项包括: operator[] - 大多数STL实现不执行边界检查,并应将其转换为基础字符数组上的相同操作。 AFAIK STLPort可以选择执行边界检查,此时此运算符会稍微慢一些。

那么使用std :: string可以获得什么?它免除了手动内存管理;调整数组的大小变得更容易,通常你不必考虑释放内存。

如果您在调整字符串大小时担心性能,那么可能会发现reserve有用的功能。

如果您在类似文本等中使用字符数组,请使用std :: string更灵活,更易于使用。如果你将它用于其他数据存储?使用数组(首选矢量)

即使性能至关重要,最好使用vector<char> - 它允许事先分配内存(reserve()方法)并帮助您避免内存泄漏。使用vector :: operator []会导致开销,但是你总是可以提取缓冲区的地址并将其编入索引,就好像它是一个char *。

AFAIK内部大多数std :: string实现copy on write,引用计数语义以避免开销,即使字符串未通过引用传递。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top