【发布时间】:2011-07-05 06:55:15
【问题描述】:
这个问题是特定于 MSVC 编译器(特别是 2008 年),但我也对非编译器特定的答案感兴趣。
我正在尝试根据某些任意类型的对齐方式来确定如何对齐堆栈上的字符缓冲区。理想情况下,代码如下:
__declspec( align( __alignof(MyType) ) ) char buffer[16*sizeof(MyType)];
不幸的是,这不起作用
错误 C2059:语法错误: '__builtin_alignof'
编译器只是不喜欢嵌套语句。
我唯一的另一个想法是这样做:
char buffer[16*sizeof(MyType)+__alignof(MyType)-1];
char * alignedBuffer = (char*)((((unsigned long)buffer) + __alignof(MyType)-1)&~(__alignof(MyType)-1));
有人知道更好的方法吗?似乎 declspec 的东西应该可以工作,我只是语法错误还是什么?
感谢阅读:)
【问题讨论】:
-
...the __alignof [struct] is the alignment requirement of the largest element in the structure.(msdn.microsoft.com/en-us/library/45t0s5f4(v=vs.71).aspx) -
如果您想节省空间并压缩数据,为什么不直接使用 align(1)?
-
这并不是真正的节省空间,它更多的是在堆栈上为任意类型分配空间,并尊重该类型的对齐要求。第二个代码块就是这样做的,我只是想知道(通常情况下)是否有更好的方法来做到这一点。
-
er,你为什么不按正常的方式在堆栈上分配对象呢?然后编译器会为你对齐。
-
@jalf 这意味着将为缓冲区中的每个元素调用一次类型的构造函数。这就是我要避免的:)