0

为什么将 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

4 回答 4

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++ 风格的强制转换是一个很好的“警报”相同(阅读时容易发现,易于搜索)。但是您可能更喜欢对所有事物都使用相同的警报,在这种情况下,您可以将参数转换为memcpyto void*

顺便说一句,我可能会同时使用这sizeof r两种尺寸而不是sizeof(int)碰巧是)”。由于它是一个发送缓冲区,我猜缓冲区是有线协议要求的大小,并且r应该与缓冲区匹配,而不是相反。所以sizeof(int)可能是合适的,但4或者PROTOCOL_INTEGER_SIZE可能仍然更合适。

于 2012-09-18T09:39:41.117 回答
3

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

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

应该:

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

或者

reinterpret_cast<char*>(&r+1)

这些或memcpy等效的都可以。其他任何事情都有对齐问题的风险。

于 2012-09-18T07:57:58.720 回答
2

它是用于这些目的的通用货币,reinterpret_cast但标准清楚地表明static_castviavoid*是完全可以接受的。事实上,在像intthen这样的类型的情况下,它reinterpret_cast<char*>(&r)定义为具有 的语义static_cast<char*>(static_cast<void*>(&r))。为什么不明确并直接使用它?

如果你养成了这个习惯,那么将来使用reinterpret_cast最终将具有实现定义的语义的static_cast链而不是始终具有明确定义的语义的链的机会就会减少。

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

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]);
于 2012-09-18T09:10:17.557 回答
0

迈克尔安德森指出的小错误

但你可以这样做:

#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";
}
于 2012-09-18T07:59:55.537 回答