выравнивание памяти -Sparc (Sun )компилятор cc, Intel (Linux )компилятор g++, Intel (Windows )компилятор MVSC

Мой вопрос состоит из 2 частей.

  1. Я заметил, что memalign (block _size,bytes )на sparc (sun )с компилятором cc не проверяет, что байты являются степенью двойки, в отличие от memalign на intel linux и _выровнен _malloc в окнах с компилятором mvsc, который проверяет, что байты являются степенью числа 2.

это баг на солнце, есть ли патч или мне нужно самому написать мемлайн.

  1. Кроме того, у меня есть структура (, а не мой код ):

    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 )), и я изменил его на _выровненный _malloc, моя проблема в том, что sizeof (CLHLockStruct )не является степенью двойки, я могу написать некоторую функцию, которая находит следующее число, являющееся степенью двойки.

Является ли их лучший подход?

РЕДАКТИРОВАТЬ1

Как я могу дополнить эту структуру, чтобы ее размер был равен степени 2?

РЕДАКТИРОВАТЬ2

Есть ли функция, которая действует как _выровненная _malloc и malloc :, возвращает указатель памяти, выровненный по кратному размеру блока _, но не требует, чтобы байты были степенью 2?

5
задан Michael 8 August 2012 в 07:07
поделиться