我需要分配16字节对齐的内存,而我可以告诉已接受的方法是posix_memalign()
,使用man page作为参考(其他StackOverflow问题表明这是所以)。下面的代码被简化为排除不相关的部分(即其他平台),但我保留了一些上下文(sse只是命名空间):
#include <malloc.h>
#include <stdlib.h>
float* sse::alloc(unsigned int count)
{
void* p;
int r = posix_memalign(&p,16,sizeof(float)*count);
if ( r == 0 )
return (float*)p;
/* else output error and exit(1) - has never failed */
else exit(1);
}
void sse::free(float* p)
{
free(p);
}
使用它的代码非常明显:
int main(int argc, char* argv[])
{
const unsigned int total = 16000;
float *array = sse::alloc(total), *arr2 = sse::alloc(total);
/* null ptr checks */
// ...
sse::free(array); sse::free(arr2);
return 0;
}
我已经注释掉了所有非基本代码来测试它,并确认它确实在free(p);
上“挂起” - 当我在gdb中 Ctrl-C 时它会报告线。 valgrind中的行为没有区别,SSE代码(使用Intel内在函数)(代替...
)成功运行。我一直在使用相当标准的选项进行编译:{{1}},并尝试了无/不优化,无调试和一些不必要的强制转换。有关我的系统的一些信息(请询问您是否想要更多):
由于手册页明确指出-g -O3 -std=c++11
是正确的函数,我感到非常难过,我宁愿避免编写一个使用new / delete和padding 15个字节的机制(原因很明显)。如果有一个我不知道的替代方案,我很乐意尝试。此外,有关这种挂起的潜在原因的信息可能证明是有用的,因为搜索这些术语中的一些特别困难(比搜索“堆栈溢出”更容易)。
答案 0 :(得分:14)
你需要调用全局免费 - 将自由例程更改为:
void sse::free(float* p)
{
::free(p);
}
命名空间规则会导致它调用sse::free
,除非另有说明