这是我在Visual 2013上的代码。 我需要一个新的对齐。 我不能仅因为A CTOR做了一些有用的事情而分配。
知道为什么不编译?
#include <memory>
#include <emmintrin.h>
struct A{
A():b(0){b++;}
int b;
};
template<typename T,int alignment>
inline T* aligned_new(){
try{
T*ptr = reinterpret_cast<T*>(_mm_malloc(sizeof(T),alignment));
new (ptr) T;
return ptr;
}
catch (...)
{
return nullptr;
}
}
template<typename T>
inline void aligned_delete(T*ptr){
_mm_free(ptr);
}
int main(int argc, char * argv[]){
std::unique_ptr<A, aligned_delete<A>> var(aligned_new<A,16>);
return 0;
}
溶液
template<typename T>
struct aligned_delete {
void operator()(T* ptr) const {
_mm_free(ptr);
}
};
答案 0 :(得分:4)
aligned_delete<A>
是一个函数,而不是一个类型。
使用重载函数调用运算符创建一个类型:
template<typename T>
struct aligned_delete {
void operator()(T* ptr) const {
_mm_free(ptr);
}
};
答案 1 :(得分:0)
您的异常处理有点过时,如果构造失败,您将泄漏分配的内存。如果_mm_malloc
返回nullptr
,它也会有未定义的行为。尝试:
template<typename T, std::size_t alignment>
inline T* aligned_new(){
void* ptr = _mm_malloc(sizeof(T), alignment);
if (ptr) {
try {
return new (ptr) T;
} catch(...) {
_mm_free(ptr);
throw;
}
}
// throw std::bad_alloc();
return nullptr;
}
(是的,这不是答案 - 这是一个过长的评论。)