简单的问题,这会解决对齐问题吗?
union
{
char real_array[sizeof(T)*size];
T fake_array[size];
};
答案 0 :(得分:6)
是的,这应解决对齐问题。虽然没有必要让fake_array
成为一个数组。只需一个T
类型的成员即可。
这实际上是一种相当广泛使用的技巧,用于强制某些数组上的特定对齐。
作为一个迂腐的旁注:匿名工会只存在于C ++中,但不存在于C中。
答案 1 :(得分:1)
我不这么认为,如果你回头看看你发布的链接就说'好吧我终于明白了,它可能会从一个错误的地址开始。' 您仍然无法控制联盟第一个成员的地址。
答案 2 :(得分:1)
是的,即使是下面更简单的结构也可以解决问题。
union
{
char real_array[sizeof(T)*size];
T dummy;
};
我认为ISO标准下面的引用足以保证其有效。
按顺序提供一项特殊保证 简化工会的使用:如果一个 POD-union包含几个POD结构 共享一个共同的初始序列, 如果是这个的对象 POD-union类型包含其中之一 POD结构,允许 检查共同的初始序列 任何POD结构成员;
但是,如果您使用非POD类,您可能会想知道是否存在导致未定义行为的漏洞......(但我敢打赌它可以与任何编译器一起使用)。