在C++ 11中从向量复制到结构中

lpp*_*ier 0 c++ c++11

在C++ 11中,执行以下代码的最佳方法是什么:

// definitions
vector<char> rcvbuf; 

 struct somethingParams
{
  char Magic[4]; 
  int Version; 
  int MsgID; 
  int MsgLen;
};
Run Code Online (Sandbox Code Playgroud)

码:

struct somethingParams mParams; 
memcpy(&mParams, rcvbuf.data(), sizeof(somethingParams)); 
rcvbuf.erase(rcvbuf.begin(), rcvbuf.begin + sizeof(somethingParams));
Run Code Online (Sandbox Code Playgroud)

根据我的阅读,不建议在C++中使用memcpy.我知道这是"C风格".有没有更好的方法来实现我正在做的事情?(即将数据从向量复制到结构中.)

只是看看我是否可以使它更像"C++".

谢谢.

Bri*_*ian 5

memcpy是C++的犹太人.当然它不应该用于制作数组的副本(我们有std::copy这个,以及向量和其他有趣的东西)但是从二进制数据初始化结构的情况本质上是类型不安全的,所以C++不给出你在这里的任何东西,C没有.

但是,您必须记住memcpy仅使用简单的可复制类型.您可以使用a static_assert来确保不违反此规则并触发未定义的行为.

static_assert(std::is_trivially_copyable<somethingParams>::value,
              "somethingParams must be trivially copyable");
Run Code Online (Sandbox Code Playgroud)

  • 你应该`assert`或`static_assert`你的struct和整数字节顺序的大小.你应该用必要的打包pragma声明它.否则,在下一次更改整数大小或对齐规则时,代码将以不可见的方式中断.最糟糕的情况是你运送它并稍后发现数据文件与旧的x86版本不兼容,然后你必须添加疯狂的黑客来尝试检测文件中的哪个结构变体. (2认同)