将char *分配给字符串而不复制

时间:2013-10-11 13:29:06

标签: c++ arrays string copy

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

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

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

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

欢迎任何其他想法!

谢谢!

5 个答案:

答案 0 :(得分:13)

  

是否有可能以某种方式避免这种情况,并且“将<{em}”内容{/ 1}}分配给预先存在的地址?

没有

但是,您可以将其指定给std::string_view。展望未来,std::string 除了拥有内存之外的所有用途都应替换为std::string

答案 1 :(得分:2)

std::string没有且不可能支持此功能,因为它拥有字符串缓冲区。

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

现在,string应该通过指针得到一些未知的内存块?这个内存是在堆上还是在堆栈上分配的,或者是数据段中的只读内存?没有string可能做的任何事情都是有效的,并且不会泄漏或导致在一种或另一种情况下崩溃。

答案 2 :(得分:1)

不,因为std::string通常期望超过char*可以提供,最明显的是将存储重新分配到完全不同的内存位置。另外,std::string不能保证以空值终止,它只提供begin()end()

但请注意std::stringchar[]有相当常见的界面:

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

这是C ++标准模板库的核心 - 容器和算法是分开的,同一算法可以在std::stringchar[]上运行。

当然char*不是char[],但char*的OTOH 看起来与begin(char[])和{{1}完全相同这样就足以让你将它连接到以随机访问迭代器为工作的STL实用程序。

答案 3 :(得分:1)

广泛传播的std::string实施不会实现此类功能。即使使用placement new(),因为内部成员可以从一个实现更改为另一个实现,或者从一个版本更改为另一个版本,或者取决于某些#define ...还可以选择提供您自己的RFA_string from Reuters Foundation API 1}}分配器,但这似乎不是处理这类问题的方法......

某些std::string实施允许缓冲区重用为initializing std::string from char* without copy

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

此外,SGI STL使用的boost还有{{3}} ......

答案 4 :(得分:-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