如何将int复制到char的boost / std ::数组?

时间:2012-09-18 07:54:26

标签: c++ boost c++11 boost-asio

将int复制到boost / std :: array的最简单有效的原因是什么?

以下似乎有效,但我不确定这是否是最合适的方法:

  int r = rand();
  boost::array<char, sizeof(int)> send_buf;
  std::copy(reinterpret_cast<char*>(&r), reinterpret_cast<char*>(&r + sizeof(int)), &send_buf[0]);

4 个答案:

答案 0 :(得分:4)

只是为了比较,这与memcpy是一样的:

#include <cstring>

int r = rand();
boost::array<char, sizeof(int)> send_buf;
std::memcpy(&send_buf[0], &r, sizeof(int));

你的召唤是否爆炸的演员阵容(以及错误的机会)比使用C中也存在的函数的C ++“罪恶”更好或更差; - )

我个人认为memcpy对于这种操作来说是一个非常好的“警报”,因为C ++风格的演员阵容是一个很好的“警报”(在阅读时易于发现,易于搜索)。但您可能更喜欢对所有内容使用相同的警报,在这种情况下,您可以将memcpy的参数转换为void*

不过,我可能会将sizeof r用于两个大小而不是sizeof(int),但这取决于上下文是否要求数组“对于r来说足够大(恰好是一个int) “或”的大小与int(r恰好是)相同“。因为它是一个发送缓冲区,我想缓冲区是有线协议要求的大小,而r应该与缓冲区匹配,而不是相反。因此sizeof(int)可能是合适的,但4PROTOCOL_INTEGER_SIZE可能更合适。

答案 1 :(得分:3)

这个想法是正确的,但你有一个错误:

reinterpret_cast<char*>(&r + sizeof(int))

应该是:

reinterpret_cast<char*>(&r) + sizeof(int)

reinterpret_cast<char*>(&r+1)

这些或memcpy等效即可。任何其他风险都会导致对齐问题。

答案 2 :(得分:2)

reinterpret_cast用于这些目的是常见的货币,但标准明确表明static_cast来自void*是完全可以接受的。事实上,在类似int的类型的情况下,reinterpret_cast<char*>(&r) 已定义以具有static_cast<char*>(static_cast<void*>(&r))的语义。为什么不明确并直接使用?

如果你养成习惯,你将来使用reinterpret_cast的机会就会减少,而static_cast最终会有一个实现定义的语义,而不是一个总是定义明确的int r = rand(); boost::array<char, sizeof(int)> send_buf; auto cast = [](int* p) { return static_cast<char*>(static_cast<void*>(p)); }; std::copy(cast(&r), cast(&r + 1), &send_buf[0]); 链。语义。

请注意,您可以将指向单个对象的指针视为指向一个数组的指针(参见5.7 / 4)。这对于获得第二个指针很方便。

{{1}}

答案 3 :(得分:0)

Michael Anderson指出的小错误

但你可以这样做:

#include <iostream>

union U
{
    int  intVal;
    char charVal[sizeof(int)];
};

int main()
{
    U   val;
    val.intVal  = 6;

    std::cout <<  (int)val.charVal[0] << ":" << (int)val.charVal[1] << ":" << (int)val.charVal[2] << ":" << (int)val.charVal[3] << "\n";
}