Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从char*初始化std::string而不复制_C++_String_Memory Management_Stl - Fatal编程技术网

C++ 从char*初始化std::string而不复制

C++ 从char*初始化std::string而不复制,c++,string,memory-management,stl,C++,String,Memory Management,Stl,我需要处理大量(许多GB)的数据,例如: 通过附加许多较小的(C char*)字符串来构建一个大字符串 修剪绳子 将字符串转换为C++ const STD::用于处理的字符串(只读) 重复 每个迭代中的数据都是独立的 我的问题是,我想尽量减少(如果可能的话)堆分配内存的使用,因为这是目前我最大的性能问题 是否有一种方法将C字符串(char)转换成STL C++字符串(STD::string),而不需要STD::string内部分配/复制数据? 或者,我可以使用stringstreams或类似的东

我需要处理大量(许多GB)的数据,例如:

  • 通过附加许多较小的(C char*)字符串来构建一个大字符串
  • 修剪绳子
  • 将字符串转换为C++ const STD::用于处理的字符串(只读)
  • 重复
  • 每个迭代中的数据都是独立的

    我的问题是,我想尽量减少(如果可能的话)堆分配内存的使用,因为这是目前我最大的性能问题

    是否有一种方法将C字符串(char)转换成STL C++字符串(STD::string),而不需要STD::string内部分配/复制数据? 或者,我可以使用stringstreams或类似的东西来重用大型缓冲区吗

    编辑:谢谢你的回答,为了清楚起见,我想修改后的问题是:


    如何有效地构建(通过多个附加)一个STL C++字符串。如果在一个循环中执行此操作,其中每个循环都是完全独立的,那么我如何重新使用分配的空间。

    每个迭代是否足够独立,可以为每个迭代使用相同的std::string?我们希望您的std::string实现足够智能,可以在以前用于其他用途时为其分配一个const char*来重用内存


    将char*分配到std::string中必须始终至少复制数据。内存管理是使用std::string的主要原因之一,因此您将无法覆盖它。

    要帮助处理真正大的字符串,SGI的STL中有类Rope。
    非标准,但可能有用

    显然,rope在标准的下一个版本中:-)

    注意开发人员的笑话。绳子是一根大绳子。(哈哈):-)

    如果不复制数据,实际上无法形成std::string。stringstream可能会在不同的过程中重复使用内存(尽管我认为标准没有说明是否必须这样做),但它仍然无法避免复制

    解决这类问题的一种常见方法是编写在步骤3中处理数据的代码,以使用开始/结束迭代器对;然后,它可以轻松地处理std::string、字符向量、一对原始指针等。与传递std::string之类的容器类型不同,它不再知道或关心内存是如何分配的,因为它仍然属于调用方。逻辑结论是,它添加了所有重载构造函数,仍然让调用方只传递一个字符串/向量/列表/任何类型的容器,其中包含.begin()和.end(),或单独的迭代器

    在编写处理代码以在任意迭代器范围内工作之后,您甚至可以编写自定义迭代器(不像听起来那么难,基本上只是一个具有一些标准typedef的对象,并且运算符+/*/=/=!=重载以获得仅向前的迭代器)这需要在每次到达正在处理的片段的末尾时,跳过空白(我想这就是您所说的修剪)前进到下一个片段。你根本不需要连续组装整根绳子。这是否会是一场胜利取决于你有多少碎片/碎片有多大。这就是Martin York提到的SGI rope的本质:一个字符串,其中append形成一个片段链表,而不是一个连续的缓冲区,因此它适用于更长的值


    更新(因为我仍然偶尔看到对这个答案的投票):


    C++17引入了另一个选项:,它取代了许多函数签名中的std::string,是对字符数据的非所有权引用。它可以从std::string隐式转换,但也可以从其他地方拥有的连续数据显式构造,从而避免不必要的复制std::string。

    在这种情况下,直接处理char*是否更好,而不是将它分配给STD::String。

    < P>在步骤1中是否完全可以使用C++字符串?如果你使用String::Retro(siZeHT),你可以分配一个足够大的缓冲区来防止多个堆分配,同时附加较小的字符串,然后你可以在所有其余步骤中使用相同的C++字符串。
    有关保留功能的更多信息,请参阅。

    这是一个横向思考回答,不是直接解决问题,而是围绕问题进行“思考”。可能有用,也可能没有

    std::string的只读处理实际上并不需要std::string功能的非常复杂的子集。您是否有可能对执行std::strings所有处理的代码执行搜索/替换,以便它采用其他类型?从空白类开始:

    类轻量级_字符串{}


    然后用轻量级字符串替换所有std::字符串引用。执行编译,以准确地了解轻量级_字符串上需要哪些操作才能充当插入式替换。然后,你可以让你的实现工作不管你想要什么。< /P>是的,虽然输入(C char *)和输出(STD::String)不在我的控制之下。你的解决方案听起来像是IM之后,但是,当你说“你可以使用同样的C++字符串”时,你是指使用CULL(),然后继续构建下一个字符串?目前,这个解决方案对我来说是最简单的,尽管我不确定使用clear()的标准是否实际指定了重用(尽管它似乎在我的实现中起作用)。据我所知,clear()不会释放字符串使用的内存,因此不会影响reserve()分配的空间。@Akusete@e.James:(是的,我知道它是2.5年后的事了)当我阅读标准的相关部分时,clear()是根据erase()和erase()定义的特别地,不指定调用erase()之后使用的内存块是否与调用cal()之前使用的内存块相同