我关注对齐和Interlocked
操作。再次。这些函数的文档指出我们想要更新的变量应该在32位边界上对齐,并且我们可以通过_aligned_malloc
实现这一点。细
所以我有这个小测试程序:
struct S
{
char c;
long l;
}an_S;
printf("%p, %p", (void*)(&(an_S.c)), (void*)(&(an_S.l)));
在释放模式下,从此输出总是给出一个long的地址,它是char的地址之后的4个字节,因此它从32bit边界开始。
1)这纯粹是偶然的,还是我可以依赖于此而不需要_aligned_malloc
?
2)如果我必须使用aligned_malloc
,有人可以澄清怎么做吗?我已经在https://msdn.microsoft.com/en-us/library/8z34s9c6.aspx阅读了文档,但似乎没有显示如何为“已分配”的内存分配值...
3)(假设我确实需要aligned_malloc
)如果我想要一个具有如上所述的长变量的结构数组,需要通过Interlocked操作进行操作,我是否需要添加某种排序构造函数来设置它还是会有更简单的方法呢?
4)我在Google上搜索了_aligned_malloc + interlockedCompareExchange,它只回购了70个结果。这告诉我,使用InterlockedCompareExchange
(62,800个结果)的大部分代码都是错误的,或者_aligned_malloc
不是必需的。请有人澄清一下吗?
答案 0 :(得分:4)
如果你的结构是对齐的,这是默认的,那么每个成员将被对齐以适合成员类型。
就malloc
而言,MSVC的documentation解释说,在32个目标上,内存是8字节对齐的,在64位目标上,它是16字节对齐的。所以你可以使用malloc
。