7

这是一个非常简单的问题,但是我发现它很棘手。我想将 achar*视为 a std::string,例如:

    char *p = ...; // read a huge chuck from a file

    std::string s(p); // this is not what I want

所以,如果我使用构造函数,我会得到一个 p 的副本,这是对内存和时间的浪费。是否有可能以某种方式避免这种情况,并将内容“分配std::string到预先存在的地址?

任何其他想法都非常受欢迎!

谢谢!

4

5 回答 5

14

是否有可能以某种方式避免这种情况,并将内容“分配std::string到预先存在的地址?

不。

但是,您可以将其分配给std::string_view. 展望未来,所有使用std::string except to own memory都应该替换为std::string_view.

于 2013-10-11T13:29:43.753 回答
2

std::string不支持也不可能支持这一点,因为它拥有字符串缓冲区。

这意味着它最终必须释放内存,或者重新分配它以防您将字符串更改为具有不同的长度。如果不是更早,那么它必须在程序退出时这样做。

现在,string应该如何处理通过指针获得的一些未知内存块?该内存是在堆上还是在堆栈上分配的,或者可能是数据段中的只读内存?在一种或另一种情况下,没有什么string可以做是有效的,也不会泄漏或导致崩溃。

于 2013-10-11T13:34:27.250 回答
1

,广泛传播的std::string实现不实现这样的功能。即使使用,placement new()因为内部成员可以从一个实现更改为另一个,或者从一个版本更改为另一个版本,或者取决于一些#define......还有提供您自己的std::string分配器的选项,但这似乎不是处理这样的问题...

的,一些string实现允许缓冲区重用作为RFA_string来自 Reuters Foundation API的。

这个想法已经在其他一些问题/答案中得到处理:

此外,还有boost使用的SGI STL的绳索数据结构......

于 2013-10-11T14:46:49.537 回答
1

不,因为std::string通常期望不止一个char*可以提供,最值得注意的是将存储重新分配到完全不同的内存位置。此外 astd::string不保证以空值结尾,它只提供 abegin()和 an end()

但请注意,std::string并且char[]有相当通用的接口:

  • 你可以用数字索引它们并获得chars
  • 你可以调用它们std::beginstd::end获得随机访问迭代器,这样算法sort就可以自由地对它们进行操作。

这就是 C++ 标准模板库的核心——容器和算法是分开的,相同的算法可以在 astd::string和 a上运行char[]

当然char*不是char[],但 OTOH 一char*s 看起来与 and 完全一样,begin(char[])因此end(char[])足以让您将其连接到在随机访问迭代器方面工作的 STL 实用程序。

于 2013-10-11T13:36:48.260 回答
-2

为什么不使用std::vector<char>?例如:

std::vector<char> data;
data.resize( size );  // resize this to how much you need 

char* p = &data[0];

// now you have a pointer to the internal data in std::vector 
于 2013-10-11T13:33:43.137 回答