【发布时间】:2016-09-20 13:12:52
【问题描述】:
uint32_t u32 = 0;
uint16_t u16[2];
static_assert(sizeof(u32) == sizeof(u16), "");
memcpy(u16, &u32, sizeof(u32)); // defined?
// if defined, how to we access the data from here on?
这是定义的行为吗?如果是这样,我们可以使用什么类型的指针来访问memcpy之后的目标数据?
我们必须使用uint16_t*,因为它适合u16的声明类型吗?
或者我们必须使用uint32_t*,因为源数据的类型(memcpy复制的源数据)是uint_32?
(个人对 C++11/C++14 感兴趣。但讨论 C 等相关语言也会很有趣。)
【问题讨论】:
-
现在可以了 :-)(我忘记了
&和另一个错字) -
您是否正在尝试找出您的 CPU 的字节序?
-
@Bob__,我目前没有特别的应用。但我会说,根据答案,它可能会允许我在未来在某些项目中考虑进行一些积极的优化。
-
@Bob__,也许这可以更好地传达我希望确认的内容:“给定一个声明为
X类型的变量,它总是是合法的通过X类型的指针访问它。并且memcpy进入这样的变量总是很酷并且不会更改类型,只要您坚持使用可以推断位模式的简单类型(整数,指针, ...) 并且在陷阱表示或对齐方面没有问题”.
标签: c++11 strict-aliasing