C编程malloc宏问题



使用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;
}

谢谢你的帮助。

思考替代方案:

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))

MEM_ALLOC_C()宏中的问题是将type参数同时用作类型和左值。无法工作:

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

请注意,在您的工作版本中,您必须在左值所在的位置使用变量名,在其他位置使用类型。

如果你真的想拥有这样的宏,为什么不像函数一样使用它,并将结果分配给指针,而不是将分配隐藏在宏中:

#define MEM_ALLOC_C(type, nElements) ((type*)_aligned_malloc(nElements * sizeof(type), CACHE_ALIGNMENT))
testFloat = MEM_ALLOC_C(float, INDEX);

相关内容

  • 没有找到相关文章

最新更新