我的问题由两部分组成。
- 我注意到使用 cc 编译器的 sparc(sun) 上的 memalign(block_size,bytes) 不检查字节是否为 2 的幂,这与使用 mvsc 编译器的 intel linux 上的 memalign 和 Windows 上的 _aligned_malloc 进行检查相反字节是 2 的幂。
这是 sun 中的错误,是否有补丁,或者我需要自己编写一个 memalign。
另外我有一个结构(不是我的代码):
typedef struct CLHLockStruct { volatile CLHLockNode CACHE_ALIGN *Tail ; volatile CLHLockNode CACHE_ALIGN *MyNode[N_THREADS] ; volatile CLHLockNode CACHE_ALIGN *MyPred[N_THREADS] ; } CLHLockStruct;
我在 MVSC (visual studio 2008) 下编译:
CACHE_LINE_SIZE = 64
CACHE_ALIGN = __declspec(align(CACHE_LINE_SIZE))
N_THREADS = 8
sizeof(CLHLockStruct)=192
代码最初是为 sparc 架构编写的,我尝试在不更改太多代码的情况下将其迁移到 MVSC。
在他们的代码中,他们使用 memalign(CACHE_LINE_SIZE,sizeof(CLHLockStruct)),我已将其更改为 _aligned_malloc,我的问题是 sizeof(CLHLockStruct) 不是 2 的幂,我可能会编写一些函数来查找下一个2 的幂数。
他们是更好的方法吗?
编辑1
如何填充此结构,使其大小为 2 的幂?
EDIT2
是否有一个功能类似于 _aligned_malloc 和 malloc:返回一个与 block_size 的倍数对齐但不要求字节为 2 的幂的内存指针?
最佳答案
in their code they use memalign(CACHE_LINE_SIZE,sizeof(CLHLockStruct)), and i have changed it to _aligned_malloc , my problem is that sizeof(CLHLockStruct) is not a power of 2,
您是否将其更改为 _aligned_malloc(CACHE_LINE_SIZE,sizeof(CLHLockStruct))
?是的,那会导致这个。 _aligned_malloc
期望大小作为其第一个参数,对齐方式作为第二个参数,与 memalign
相反,因此您需要交换参数。大小不需要是 2 的幂。
关于c++ - 内存对齐 - Sparc(Sun) cc 编译器、Intel(Linux) g++ 编译器、Intel(Windows) MVSC 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11858611/