c - 联锁操作和与 _aligned_malloc 对齐

标签 c multithreading winapi

我担心对齐和 Interlocked 操作。再次。这些函数的文档指出我们要更新的变量应该在 32 位边界上对齐,我们可以通过 _aligned_malloc 实现这一点。很好。

所以我有这个小测试程序:

struct S
{
    char c;
    long l;
}an_S;

printf("%p, %p", (void*)(&(an_S.c)), (void*)(&(an_S.l)));

在 Release模式下,输出总是给我一个 long 的地址,它在 char 地址之后 4 个字节,因此它从 32 位边界开始。

1) 这纯粹是偶然的,还是我可以依靠它从而不需要 _aligned_malloc

2) 如果我必须使用 aligned_malloc,有人可以说明如何使用吗?我已阅读 https://msdn.microsoft.com/en-us/library/8z34s9c6.aspx 的文档但这似乎并没有说明如何为“分配”的内存分配一个值......

3) (假设我确实需要 aligned_malloc)如果我想要一个像上面那样具有 long 变量的结构数组,需要通过互锁操作对其进行操作,我是否需要添加某种构造函数来设置它,或者会有更简单的方法吗?

4) 我在谷歌上搜索了 _aligned_malloc+interlockedCompareExchange,它只 repo 了 70 个结果。这告诉我,使用 InterlockedCompareExchange(62,800 个结果)的大部分代码是错误的,或者 _aligned_malloc 不是必需的。有人可以澄清一下吗?

最佳答案

如果您的结构是对齐的,这是默认设置,那么每个成员都将对齐以适合成员类型。

malloc 而言,documentation对于 MSVC 解释说,在 32 位目标上,内存是 8 字节对齐的,在 64 位目标上,它是 16 字节对齐的。所以你可以使用 malloc

关于c - 联锁操作和与 _aligned_malloc 对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50135073/

相关文章:

c - size_t 是否足够大以表示任何类型的大小?

C:通过支持该程序来提升 Linux 中的权限

python - 线程在 Python 中是如何工作的,Python 线程特有的常见陷阱是什么?

c# - 如何正确避免C#中的线程创建开销/重用线程

c++ - HANDLE 指向的结构

c - 通过引用传递给递归函数

c - 从 C 中的函数返回一个字符串

java - 以下两种方法来调度和停止线程哪一个更好

c++ - 创建 MFC 控件的子类的正确方法是什么?

c++ - 在扩展框架中绘制会产生奇怪的颜色