解决堆栈上字符数组对齐问题

3

请参考:放置新问题

简单的问题,这会解决对齐问题吗?

union
{
    char real_array[sizeof(T)*size];
    T    fake_array[size];
};

2
为了实际使用,您需要查看 Boost/C++0x 的 aligned_storagealignment_of - GManNickG
1
它对你感兴趣的情况不起作用(避免在未使用的数组内容上调用构造函数),因为T只允许是POD(在这种情况下,您不需要任何东西,因为它们没有执行任何操作的构造函数)。 - UncleBens
3个回答

6

是的,这应该解决了对齐问题。但是并不需要将fake_array变成数组。只需一个类型为T的单个成员就足够。

实际上,这其实是一种在某些数组上强制特定对齐方式的广泛使用的技巧。

作为一个小小的注意事项:匿名联合只存在于C++中,而不是C中。


1

是的,甚至下面更简单的结构也可以完成这个技巧。

union
{
    char real_array[sizeof(T)*size];
    T    dummy;
};

我相信以下来自ISO标准的引用足以保证它的工作。

为了简化联合使用,做出了一个特殊的保证:如果POD联合包含多个共享公共初始序列的POD结构体,并且如果此POD联合类型的对象包含其中一个POD结构体,则允许检查任何POD结构体成员的公共初始序列;

然而,由于标准措辞,您可能会想知道是否存在某些漏洞导致使用非POD类时出现未定义行为...(但我敢打赌它将在任何编译器中都能正常工作)。


1

我不这么认为,如果你回头看一下你发布的链接,它说'OK I finally get it, it may start on a wrong address.'(好的,我终于明白了,它可能会从错误的地址开始。) 你仍然无法控制联合体第一个成员的地址。


语言标准保证联合体的任何成员指针也可以用作整个联合体的指针,反之亦然(经过适当的转换)。有人可能会认为这意味着所有联合体成员必须具有与整个联合体本身相同的物理地址(因为在转换点没有要求联合类型完整)。即联合体的所有成员都对齐在同一边界上,这是所有成员中最严格的。 - AnT stands with Russia
当然,我曾经苦恼于如何表达清楚。"第一个成员" 是个不妥当的说法。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接