将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]);
答案 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)
可能是合适的,但4
或PROTOCOL_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";
}