内存对齐 - Sparc(Sun)cc编译器,Intel(Linux)g ++编译器,Intel(Windows)MVSC编译器

Mic*_*ael 5 c++ architecture algorithm g++ memory-alignment

我的问题由两部分组成.

  1. 我注意到使用cc编译器在sparc(sun)上的memalign(block_size,bytes)不会检查字节是2的幂,而不是在intel linux上的memalign和使用mvsc编译器的windows上的_aligned_malloc检查字节是否为2的力量.

这是一个阳光下的虫子,有补丁还是我需要自己写一个memalign.

  1. 另外我有一个结构(不是我的代码):

    typedef struct CLHLockStruct {
        volatile CLHLockNode CACHE_ALIGN *Tail ;
        volatile CLHLockNode CACHE_ALIGN *MyNode[N_THREADS] ;
        volatile CLHLockNode CACHE_ALIGN *MyPred[N_THREADS] ;
    } CLHLockStruct;
    
    Run Code Online (Sandbox Code Playgroud)

我在MVSC下编译(visual studio 2008):

    CACHE_LINE_SIZE = 64
    CACHE_ALIGN = __declspec(align(CACHE_LINE_SIZE)) 
    N_THREADS = 8
    sizeof(CLHLockStruct)=192
Run Code Online (Sandbox Code Playgroud)

该代码最初是为sparc架构编写的,我尝试将其迁移到MVSC而无需更改代码.

在他们的代码中他们使用memalign(CACHE_LINE_SIZE,sizeof(CLHLockStruct)),并且我已将其更改为_aligned_malloc,我的问题是sizeof(CLHLockStruct)不是2的幂,我可能会写一些函数找到下一个数字是2的力量.

他们是更好的方法吗?

EDIT1

我如何填充这个结构,使其大小为2的幂?

EDIT2

是否有一个像_aligned_malloc和malloc一样的函数:返回一个与block_size的倍数对齐的内存指针,但不要求字节为2的幂?

小智 4

在他们的代码中,他们使用 memalign(CACHE_LINE_SIZE,sizeof(CLHLockStruct)) ,我已将其更改为 _aligned_malloc ,我的问题是 sizeof(CLHLockStruct) 不是 2 的幂,

你把它改成了吗_aligned_malloc(CACHE_LINE_SIZE,sizeof(CLHLockStruct))?是的,这会导致这个。_aligned_malloc期望大小作为其第一个参数,对齐方式作为第二个参数,与 相反memalign,因此您需要交换参数。大小不必是 2 的幂。