我有一个MyType
类型的对象,出于SSE原因,需要对齐16字节。所以,我编写了一个分配器并重载了new
个运算符。 MyType
中的方法:
inline static void* operator new(size_t size) {
awesome::my_allocator<MyType,16> alloc;
return alloc.allocate(size);
}
inline static void* operator new[](size_t size) { return operator new(size); }
inline static void operator delete(void* ptr) {
awesome::my_allocator<MyType,16> alloc;
alloc.deallocate(reinterpret_cast<MyType*>(ptr),0); //last arg ignored in my impl
}
inline static void operator delete[](void* ptr) { operator delete(ptr); }
现在,出于缓存局部性的原因,我需要将一个实例复制构造到一个64字节对齐的特定内存中:
void MyType::copy_into(uint8_t* ptr) const {
new (reinterpret_cast<MyType*>(ptr)) MyType(*this);
}
海湾合作委员会告诉我:
error: no matching function for call to ‘MyType::operator new(sizetype, MyType*)’
ICC告诉我:
error : function "MyType::operator new" cannot be called with the given argument list
1> argument types are: (unsigned __int64, MyType *)
据我了解,placement new运算符由C ++实现提供(或者可能由<new>
提供,我也试过#include
ing?)并简单地返回其参数({{1}使内存可用,并且placement new是程序员说给定的内存可用。)
奇怪的是,当上面定义的(普通!)新运算符在类中不时,错误不。实际上,new
并没有定义它们,效果很好。
问题:发生了什么?我该如何解决?
答案 0 :(得分:9)
由于您已在班级中定义operator new
,因此您需要使用全局new
来使用其展示位置版本。
#include <new>
...
::new (reinterpret_cast<MyType*>(ptr)) MyType(*this);