2012-02-07 45 views

回答

10

c_str()调用很可能被内联 - 它在所需的代码方面非常小。如果这是唯一让你退缩的事情,我会使用std::string

当然,如果你很担心,该标准建议适用:

  1. 简介它
  2. 阅读组装

另外要注意,这是一个微型优化;你很可能会浪费开发时间,担心完全不同于你应该担心的事情。

2

std::string的大多数实现可能会将实际的字符串存储为C字符串,因此c_str函数只是一个内联函数,它返回一个指针。所以一般来说,我认为正确的路要走std::string

当然,如果字符串是打算由您调用的函数修改,那么您不能使用std::string方法。相反,在调用函数之前,必须先将副本复制到自己的缓冲区中,在这种情况下,使用数组可能是一种方法。

+0

如果你很狡猾,仍然可以使用std :: string作为C++ 11中的缓冲区。 'mystr.resize(BUFFSIZE);'然后'&mystr [0]' – 2012-02-07 16:28:07

2

如上所述,c_str()将被内联。但是没有提到但我认为是你的问题最重要的方面之一是std::string遵循RAII的原则。当使用std::string时,您不需要记住释放字符串或需要担心异常安全。 只要确保std::string的每个实例都不会被破坏,直到C代码完成字符串。如果std::string是由编译器创建的临时文件,那么这尤其可能成为问题。

如果您的C函数写回字符串,您可以使用vector<char>并将大小设置为所需的缓冲区大小。这样你仍然会遵循C++ RAII原则。

+3

或者只是使用'std :: string'代替'vector '并且正确调整它的大小。 – 2012-02-07 16:18:16

+0

@MatthieuM。在所有人跳转并使用std :: string来修改字符串的C函数之前,请记住,您不能使用c_str(),它将返回一个只读的const char C风格的字符串。所以你必须使用例如&s [0]获得指向第一个字符的指针。那个记忆是连续的吗?阅读http://herbsutter.com/2008/04/07/cringe-not-vectors-are-guaranteed-to-be-contiguous/ ---矢量始终保证是连续的,但不是字符串。 (当有人问Herb关于字符串的时候,请看下面的注释) – 2015-04-17 15:37:57

+0

C++ 11改变了规则:** n3485:21.4.1 ** *(5)basic_string对象中类似char的对象应连续存储。也就是说,对于任何'basic_string'对象's',标识'&*(s.begin()+ n)==&* s.begin()+ n'应该适用于'n'的所有值, '0 <= n 2015-04-17 15:44:36

1

有一个非常简单的理由使用string它的工作原理

与C字符串工作是一种痛苦:

  • 手册存储器分配和解除分配是容易出错的
  • 接口本身是容易出错的(缺乏空字符终止的,离接一个错误和缓冲区溢出是常见的)
  • 的操作是低效的(strlenstrcpystrcat),因为该长度不必每次
在被重新计算

我真的看不到有什么理由曾经使用C字符串。

许多平台都提供了自己的特定操作,并提出了许多“更好的字符串”(哦,有多种标准的喜悦),这是一件非常痛苦的事情。

2

这取决于你在做什么,以及接口功能 在做什么。在一个极端,我不认为有人会建议将字符串文字 转换为std::string,只是这样你可以在 上调用c_str它。另一方面:任何动态构建字符串的代码应该使用 std::string。像strcpystrcat这样的函数是 缓冲区溢出的邀请函。两者之间,这取决于。我认为标准 应该很容易和安全:只要使用std::string,使用std::string即可更容易或更安全地使用 。只要你在做什么 不需要动态分配char[],并且 operator+等字符串不会被使用,你可以使用char[]

相关问题