gpt4 book ai didi

c++ - 将指针传递给第一个字符串元素作为缓冲区

转载 作者:行者123 更新时间:2023-11-30 02:13:40 24 4
gpt4 key购买 nike

我有一堆旧的 linux 代码做这样的事情:

int size_of_buffer = /*stuff computed dynamically*/;
char *buffer = malloc(size_of_buffer);
recv(socket, buffer, size_of_buffer, 0);
//do some processing of the buffer as string
free(buffer);

当我将其迁移到 C++ 时,我将其更改为:

int size_of_buffer = /*stuff computed dynamically*/;
const auto buffer = make_unique<char[]>(size_of_buffer);
recv(socket, buffer.get(), size_of_buffer, 0);
const std::string str_buffer = buffer.get();
//do some processing on str_buffer

您一定会注意到,这会导致双倍内存分配和潜在的数据多次复制。我现在的想法是将指针传递给带有 reserved 存储的 std::string 的第一个字符,如下所示:

int size_of_buffer = /*stuff computed dynamically*/;
std::string buffer;
buffer.reserve(size_of_buffer);
recv(socket, &(buffer[0]), size_of_buffer, 0);
//do some processing on buffer

以上代码是否安全且定义明确,或者是否存在一些需要避免的注意事项和危险?

最佳答案

有人问了类似的问题here .简短的回答是:没有复制是不可能的。

在C++17以下,没有std::string::data()的非const重载| , 和

1) Modifying the character array accessed through the const overload of data has undefined behavior.

因此,您不能通过data 修改字符串。

从 C++11 开始,

data() + i == std::addressof(operator[](i)) for every i in [0, size()].

因此,您也不能通过&(buffer[0])修改字符串。

在C+11之前,其实我不是很清楚,到底允许什么,所以也许通过&(buffer.begin())修改是可以的,但我不认为所以。

关于 cppreference , 实际上有一句话让我有点困惑

The elements of a basic_string are stored contiguously, that is, for a basic_string s, &*(s.begin() + n) == &*s.begin() + n for any n in [0, s.size()), or, equivalently, a pointer to s[0] can be passed to functions that expect a pointer to the first element of a (null-terminated (since C++11)) CharT[] array.

我认为这意味着 const 数组,否则它不适合文档的其余部分,现在我没有时间仔细阅读标准。

从 C++17 开始,如果您使用 std::string::resize,您的代码就可以了而不是 reserve,因为 data() 仅保证 [data(), data() + size()) 上的有效范围(或您只需构造大小合适的字符串即可)。没有从 char * 创建字符串的非复制方式。

您可以使用 std::string_view ,它有一个来自 char * 的常量构造函数。它完全符合您的要求,因为它对指针和内存没有所有权。

关于c++ - 将指针传递给第一个字符串元素作为缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58974748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com