C语言中可变长度数组如何对齐?

3

在C99中,用于对齐可变长数组(VLAs)的逻辑是什么?

我正在考虑为具有未知对齐要求的任意对象在栈上分配存储空间,因此需要最严格的对齐方式。我希望避免使用alloca(),而是使用(char) VLAs,因为它们更好地标准化。

我的GCC测试还没有成功证明它们对齐在少于16字节的任何东西上。


1
我猜测,内存对齐不是 C 标准的一部分。 - ceving
@i486 - 过早的优化,还有什么呢?虽然这是一个好建议,但它并没有回答问题。 - spbnick
1
我相信你不能依赖于字符数组的对齐方式。尝试使用-Os进行编译以减小大小,并尝试其他编译器和平台。 - Peter - Reinstate Monica
2
@ceving,你的猜测是错误的。 - Jens Gustedt
1
@spbnick:标准要求超出必要的情况非常罕见,更不会因为某人认为多余的要求更容易实现而增加。实现可以比必要的对齐方式更严格,但也可以只提供所需的对齐方式,无论这是否对实现者来说更费力。 - rici
显示剩余11条评论
1个回答

3

可变长数组(VLAs)和普通数组一样对齐。

这意味着,如果您想直接访问存储在一个char数组中的int,那么这种方式是行不通的。

您可以使用_Alignof来确定类型的对齐方式,并手动计算所需的调整,但即使如此,最好也是根据实现定义。

我认为您可能需要在编译器上禁用严格别名才能使其正常工作。


谢谢。你能提供任何证明这个的参考资料吗? - spbnick
是的,我不知道类型,只知道大小。嗯,实际上我可以将对齐方式添加到类型描述中,但最好避免这样做。 - spbnick
@spbnick,C标准就是这样规定的。_Alignof_Alignas是在C11中引入的,因此您需要一个支持此版本的编译器。 - Jens Gustedt
很遗憾,很难找到紧凑且具体的引用参考,因为C标准的对齐部分并没有特别提到VLA。 - user694733
@user694733 非常感谢!啊,看起来我只能忘记这个问题,然后按最严格的对齐方式自行对齐了。 - spbnick
2
你能把你的char VLA和intmax_t、long double和void *一起放在一个联合体中吗?这样可能会非常最大化对齐。也许为了保险起见,可以在联合体中添加一个函数指针类型! - Ian Abbott

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