是的,这应该解决了对齐问题。但是并不需要将fake_array
变成数组。只需一个类型为T
的单个成员就足够。
实际上,这其实是一种在某些数组上强制特定对齐方式的广泛使用的技巧。
作为一个小小的注意事项:匿名联合只存在于C++中,而不是C中。
是的,甚至下面更简单的结构也可以完成这个技巧。
union
{
char real_array[sizeof(T)*size];
T dummy;
};
我相信以下来自ISO标准的引用足以保证它的工作。
为了简化联合使用,做出了一个特殊的保证:如果POD联合包含多个共享公共初始序列的POD结构体,并且如果此POD联合类型的对象包含其中一个POD结构体,则允许检查任何POD结构体成员的公共初始序列;
然而,由于标准措辞,您可能会想知道是否存在某些漏洞导致使用非POD类时出现未定义行为...(但我敢打赌它将在任何编译器中都能正常工作)。
我不这么认为,如果你回头看一下你发布的链接,它说'OK I finally get it, it may start on a wrong address.'(好的,我终于明白了,它可能会从错误的地址开始。) 你仍然无法控制联合体第一个成员的地址。
aligned_storage
和alignment_of
。 - GManNickG