【发布时间】:2011-09-13 20:36:28
【问题描述】:
我有一个包含“序列化”数据的字符数组,我需要将其解释为“int”。以前我只是将指向该位置的指针转换为 'int*' 并取消引用以获取 int 数据,但尽管它对我来说效果很好,但它违反了严格的别名规则,因此违反了未定义的行为。
所以现在我使用 memcpy 将字节复制到一个 int 中,我相信这不是未定义的行为。但是我可以使用“std::copy”吗?
例如
char data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int i;
std::copy(data, data+sizeof(int), reinterpret_cast<char*>(&i));
这本身并没有违反严格的别名规则,但任何可能的实现都会这样做......但是 memcpy 有同样的问题,这是“允许的”。
这是标准编译代码还是我需要坚持使用 memcpy?
编辑:我应该补充一点,我很喜欢关于如何最好地做到这一点的答案,它们很有趣,但我的问题更多的是关于这是否合法而不是如何我这样做。
【问题讨论】:
-
memcpy不保证在重叠范围内正常工作,您需要为此使用memmove。 -
我假设 OP 执行
memcpy(&i, data, sizeof(int)),这不涉及重叠范围。 -
糟糕——我的错。混叠混叠。 叹息
-
我会使用
memcpy,因为它表示低级别操作,可以让你免于丑陋的演员阵容。 -
@BoP 可以说,
reinterpret_cast比(无强制转换的)memcpy更有效地向低级操作发出信号。
标签: c++