这是一个好的,足够快的想法,可以将一个整数值设置为char的向量(定义的vData)吗? 或者我应该使用memcpy进行这么小的操作吗?
) {
int p1 = GetInt();
int p2 = GetInt();
if ( !d_bProtected )
{
d_vData.at(p2) = p1 & 0xFF;
d_vData.at(p2+1) = (p1 >> 8) & 0xFF;
d_vData.at(p2+2) = (p1 >> 16) & 0xFF;
d_vData.at(p2+3) = (p1 >> 24) & 0xFF;
//memcpy( &d_vData[p2], reinterpret_cast<char*>(&p1), sizeof(p1) );
}
}
答案 0 :(得分:1)
由于memcpy
通常是编译器内在的,它可能会给你与手动字节复制完全相同的性能 - 这样做的好处就是不需要自己使用所有这些二进制代数。
我投票给memcpy。
答案 1 :(得分:0)
d_vData
的一个可能更好的接口是使它成为stringstream
,尽管名称如此,但它充当了更多的二进制流缓冲区,并且具有用于将任意二进制数据写入的任意二进制数据的良好接口。底层缓冲区。
这将使您的二进制读写完全通用,并且不需要您为可能写入d_vData
的每种类型编写专门的功能。
以下示例显示了这是如何实现的。
#include <sstream>
#include <iostream>
using namespace std;
template<typename T>
void write(stringstream& ss, const T& t)
{
ss.write(reinterpret_cast<char*>(&t), sizeof(T));
}
template<typename T>
void read(stringstream& ss, T& t)
{
char d[sizeof(T)];
ss.read(d, sizeof(d));
t = *(reinterpret_cast<T*>(d));
}
int read_stringstream(stringstream& ss)
{
// ensure read position is at the beginning of the stream
ss.seekg(0, ios_base::beg);
// extract data from a string stream
int i;
double d;
read(ss, i);
read(ss, d);
cout << "i:" << i << ", d:" << d << endl;
}
int main()
{
stringstream ss;
int i = 42;
double d = 69.0;
write(ss, i);
write(ss, d);
read_stringstream(ss);
}