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