是否存在一个尊重重写的new/delete的C++分配器
Is there a C++ allocator that respects an overridden new/delete?
我正在为T
类型的数组实现资源分配克隆操作。直接的实现使用new T[sz]
,然后是从源到新阵列的std::copy
调用。它在记忆中行走了两次。
我想分配原始内存,然后使用std::uninitialized_copy
,所以出于性能原因,我只遍历内存一次。我知道当使用自定义分配器(Allocator.allocate
后面跟着std::uninitialized_copy
(时如何实现这一点,并且我知道如何使用std::allocator
(在规范的第20.4.1.1节中,它使用了lib.allocator.members
后面的::operator new
(来实现这一目标。我担心的是,对于定义了T::operator new
的类型T
,基于std::allocator
的方法似乎是错误的。我知道我可以使用Boost.TypeTraits的has_new_operator
来检测这种情况。
是否有一种简单的、符合标准的方法来分配原始内存,然后以尊重重写的新内存的方式初始化原始内存(并且只传递一次内存(?如果不是,那么使用SFINAE在使用std::allocator
的实现和使用重写运算符new的实现之间进行调度是否合理?FWIW,通过Boost的grepping并没有显示出对has_new_operator
特性的这种使用。
谢谢,Rhys
这似乎是不可能的。只有operator new[]
知道如何以某种特定于实现的方式存储数组大小(如果T
具有析构函数((然后operator delete[]
利用此信息(。因此,如果没有新的表达式(也没有调用元素构造函数(,就没有可移植的方法来存储这些信息。
然后尝试放置new。
typedef std::string T;
T src[5];
char* p = new char[sizeof(T)* 5];
T* dest = (T*)p;
for(int i = 0;i < 5; ++i)
{
new(dest + i) T(src[i]); //placement new
}
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 重载运算符new[]的行为取决于析构函数
- 在 C++ 中用派生类型重写成员函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 方法重写线程C++中的概念
- 过载'operator new'如何导致无限循环?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- Codelite C++ new project
- 在OSX 10.8.2中重写"new"和"delete"时出错
- 使用 new for 2D 数组重写此 malloc
- 重写类运算符new并在不更改类的情况下删除
- 重载、重写和替换new/delete的限制是什么
- 为特定类重写new和delete操作符的原因是什么?
- 是否存在一个尊重重写的new/delete的C++分配器
- 重写操作符new函数的调用堆栈不完整
- 重写派生类中的运算符 new/delete
- 当重写new操作符时,Std::互斥锁挂起