C Программирование malloc-макроса - PullRequest
0 голосов
/ 30 марта 2012

Использование Microsoft Visual Studio 2010:

Можно ли написать этот тип макроса в C?Я не могу заставить его работать самостоятельно.

#define MEM_ALLOC_C(type, nElements) (type = (type*)_aligned_malloc(nElements * sizeof(type), CACHE_ALIGNMENT))

Если я напишу это так, это сработает:

#define MEM_ALLOC(type, nElements) (testFloat = (float*)_aligned_malloc(nElements * sizeof(float), CACHE_ALIGNMENT))

Вот как я его использую:

#define CACHE_ALIGNMENT 16
#define INDEX 7
#define MEM_ALLOC(type, nElements) (type = (float*)_aligned_malloc(nElements * sizeof(float), CACHE_ALIGNMENT))
#define MEM_ALLOC_C(type, nElements) (type = (type*)_aligned_malloc(nElements * sizeof(type), CACHE_ALIGNMENT))
#define MEM_DEALLOC_PTR(type) (_aligned_free(type))

int _tmain(int argc, _TCHAR* argv[])
{
    float* testFloat;

    //MEM_ALLOC_C(testFloat, INDEX);    // Problem here.

    MEM_ALLOC(testFloat, INDEX);        // works

    //testFloat = (float*)_aligned_malloc(INDEX * sizeof(float), CACHE_ALIGNMENT);  // works

    testFloat[0] = (float)12;

    //MEM_DEALLOC_PTR(testFloat);       // If we call de-alloc before printing, the value is not 12.
                                    // De-alloc seems to work?

    printf("Value at [%d] = %f \n", 0, testFloat[0]);

    getchar();

    MEM_DEALLOC_PTR(testFloat);

return 0;
}

Спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

подумайте о замене:

type = (type*)_aligned_malloc(nElements * sizeof(type), CACHE_ALIGNMENT)

становится

testFloat = (testFloat*)_aligned_malloc(INDEX * sizeof(testFloat), CACHE_ALIGNMENT)
.

Нет такой вещи как testFloat*.

В чистом C нет необходимости приводить результат malloc. Поэтому вы можете просто сделать:

#define MEM_ALLOC_C(var, nElements) (var = _aligned_malloc(nElements * sizeof(*var), CACHE_ALIGNMENT))
1 голос
/ 30 марта 2012

Проблема в макросе MEM_ALLOC_C() заключается в том, что вы используете параметр type как тип и значение l.это не может работать:

#define MEM_ALLOC_C(type, nElements) (type = (type*)_aligned_malloc(nElements * sizeof(type), CACHE_ALIGNMENT))
//                                    ^^^^    ^^^^                                     ^^^^
//                                   lvalue   type                                     type

Обратите внимание, как в вашей рабочей версии вы должны были использовать имя переменной, куда идет lvalue, и тип в других местах.

Если вы действительно хотитечтобы иметь такой макрос, почему бы просто не использовать его как функцию и присваивать результат указателю вместо того, чтобы скрывать присваивание внутри макроса:

#define MEM_ALLOC_C(type, nElements) ((type*)_aligned_malloc(nElements * sizeof(type), CACHE_ALIGNMENT))

testFloat = MEM_ALLOC_C(float, INDEX);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...