c++中等效的内存类型是什么?
What is the memcpy equivalent in C++
对缓冲区或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
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- 如何声明一个标准::提升直方图的向量?提升直方图的类型是什么?
- 类名后跟括号的类型是什么
- std::chrono::duration::count函数的实际结果类型是什么
- c++运算符重载-我实际返回的操作数类型是什么
- 运算符和返回类型是什么意思?
- 指向 2D 数组的指针的类型是什么?
- RSA_verify中预期的数据类型是什么,无法验证从 Java 生成的签名
- 共享_ptr中多功能数组的类型是什么
- 构造函数的类型是什么?
- 字符串中单个字符作为数组的数据类型是什么
- 该结构继承的类型是什么
- 如果我获得Integer和Double的产品,输出的数据类型是什么
- C 中被视为可可的类型是什么
- 当函数采用右值引用时,函数中该变量的类型是什么?
- STD :: SETW,STD :: SETFILL等的真实返回类型是什么?
- 模板类中引用的引用的类型是什么
- const自动参考绑定到(NULL)指针 - 实际类型是什么
- 包含通过引用捕获的 lambda 函数的"variable"的类型是什么?
- c++中等效的内存类型是什么?