C ++ Vector char整数值

时间:2016-01-22 17:48:41

标签: c++ vector integer set

这是一个好的,足够快的想法,可以将一个整数值设置为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) );
    }
}

2 个答案:

答案 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);
}