char*/字符串连接没有复制?

rig*_*717 2 c c++ string

我想在没有新的内存分配和复制的情况下在C或C++中连接2个字符串.可能吗?

可能的C代码:

char* str1 = (char*)malloc(100);
char* str2 = (char*)malloc(50);
char* str3 = /* some code that concatenates these 2 strings
                without copying to occupy a continuous memory region */
Run Code Online (Sandbox Code Playgroud)

然后,当我不再需要它们时,我只是这样做:

free(str1);
free(str2);
Run Code Online (Sandbox Code Playgroud)

或者如果可能的话,我想在C++中实现相同的功能,使用std::string或者可能char*,但是在str3上使用newdelete(可能是void operator delete ( void* ptr, std::size_t sz )运算符(C++ 14)).

关于字符串连接有很多问题,但我没有找到一个问相同的问题.

And*_*ers 7

不,这是不可能的

在C中,malloc操作返回彼此没有关系的内存块.但在C语言中,字符串必须是连续的字节数组.所以没有复制就无法扩展str1,更不用说连接了.

对于C++,也许可能会对绳索感兴趣:请参阅此答案.

绳索分配在不必连续的块中.这支持O(1)连接.但是,访问器使它显示为单个字节串.我确定将绳索转换回std :: string或C风格的字符串会占用一个副本,但这可能是最接近你想要的.

此外,担心复制几个字符串的成本可能是一个不成熟的优化.除非您要移动大量数据,否则无关紧要

  • @Olaf - 你读过我的回答:我说"不,这是不可能的",听起来像是对我的回答?不要粗鲁. (5认同)