c++中等效的内存类型是什么?

What is the memcpy equivalent in C++

本文关键字:内存类型 是什么 c++      更新时间:2023-10-16

对缓冲区或c++中的字符串使用memcpy的等效值是什么?

例如:

char message_buffer[32];
uint16_t n = 457u;
memcpy(message_buffer, &n, sizeof(n));
...

类似:

std::string message_buffer;
uint16_t n = 457u;
std::copy(messagebuffer, n);

是否没有c++的等号?我只是坚持使用memcpy,而不是std::string吗?

std::string message_buffer;
message_buffer.resize(32);
uint16_t n = 457u;
memcpy(&message_buffer[0], &n, sizeof(n));

我想我应该给我想做的更多的背景-简单地说,我正在使用套接字发送和接收数据。数据需要预先添加该数字(457)的16位二进制表示形式。所以我给出的例子只是第一步,之后我复制我想发送到缓冲区的信息,知道前2个字节(16位)包含"幻数"二进制。

std::string用于字符串。如果你想要一个字节的缓冲区,你应该使用std::vector<char>(或它的有符号/无符号对应)或std::array来代替小的固定长度缓冲区。

使用std::copy几乎总是要走的路,特别是在"高级c++ real"中。和它所有的类等等

然而,我会说当你处理像字节缓冲区这样的低级结构时,c++函数std::memcpy是最合适的选择。请记住,std::memcpy是一个"哑巴"。函数,只复制字节,但考虑到我们正在尝试填充字节缓冲区,这就是我们想要的。

std::array<char, 32> buffer;
uint16_t n = 457u;
std::memcpy(buffer.data(), &n, sizeof(n));

当然,如果你想在某些字节缓冲区中存储一个更复杂的类,例如指针成员或非平凡复制构造函数(任何不是"普通旧数据"的东西),你需要序列化对象以获得有意义的结果,就像你在C中为具有指针成员的结构体所做的那样。

类似地,您不能简单地使用memcpy将数据从缓冲区获取回某种复杂类型。您必须以适当的方式对原始字节数据进行反序列化。

对于您正在执行的特定任务,将某些不相关类型的对象的字节表示复制到缓冲区中,memcpy是合适的函数。这是因为它是独立于所涉及的类型来做这类事情的少数合法方法之一。当然,它的使用是有限的,因为它只对简单的可复制类型有效。

当你复制一些你不想破坏静态类型信息的东西时,c++提供了其他的方法,比如std::copy算法,它在迭代器上操作,而不是像memcpy()那样只操作void*

要以与平台无关的方式将16位数字457编码为字节数组,使第一个字节为01010111,第二个字节为00000100,使用:

unsigned char buffer[2];
const uint16_t n = 457u;
buffer[0] = n & 0xFF;
buffer[1] = (n >> 8) & 0xFF;

如果你需要经常这样做,你可以把这个逻辑包装在一个函数中。

你不能假设memcpy会有同样的影响。参见:https://en.wikipedia.org/wiki/Endianness