为什么将 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]);
为什么将 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]);
只是为了比较,这里与 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
to void*
。
顺便说一句,我可能会同时使用这sizeof r
两种尺寸而不是sizeof(int)
碰巧是)”。由于它是一个发送缓冲区,我猜缓冲区是有线协议要求的大小,并且r
应该与缓冲区匹配,而不是相反。所以sizeof(int)
可能是合适的,但4
或者PROTOCOL_INTEGER_SIZE
可能仍然更合适。
这个想法是正确的,但你有一个错误:
reinterpret_cast<char*>(&r + sizeof(int))
应该:
reinterpret_cast<char*>(&r) + sizeof(int)
或者
reinterpret_cast<char*>(&r+1)
这些或memcpy
等效的都可以。其他任何事情都有对齐问题的风险。
它是用于这些目的的通用货币,reinterpret_cast
但标准清楚地表明static_cast
viavoid*
是完全可以接受的。事实上,在像int
then这样的类型的情况下,它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]);
迈克尔安德森指出的小错误
但你可以这样做:
#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";
}