【发布时间】:2020-01-08 13:03:40
【问题描述】:
给定
template <typename T>
struct Vector3d { T x, y, z; };
假设 x、y 和 z 位于连续的内存位置是否安全?
对于
T = float和T = double至少可以安全假设吗?如果不能,是否可以跨平台执行?
注意:我不介意在 z 之后填充,只要 x、y、z 是连续的
【问题讨论】:
-
不,我不这么认为,编译器可以在成员之间(以及最后一个成员之后)添加填充。对于
T是double,不太可能会有填充,但仍不能保证。 -
务实的解决方案:
static_assert(sizeof(Vector3d) == 3 * sizeof(T));。任何编译器都不太可能违反这一点,因此这在实践中应该可以正常工作,同时仍然可以保护您免受某些病态平台上的微妙错误行为。 -
你可以改用
v.x() -
您想将此信息用于什么用途?使用
&x[2]之类的东西访问z是UB,即使没有填充。
标签: c++ struct memory-alignment