草庐IT

c++ - 是否可以根据分配对象的类型特征覆盖全局 new 运算符?

我正在尝试升级我们的池式固定block内存分配器以利用C++11类型特征。目前,可以通过重写theglobalnewoperator强制将任何对象的任何分配分配到正确的池中。以传统方式,例如void*operatornew(std::size_tsize){//if-cascadejustforsimplestpossibleexampleif(size在许多情况下,如果可以根据is_trivially_destructible等类型特征将对象分派(dispatch)到不同的池,我们可以进一步提高性能。是否有可能制作一个模板化的全局新运算符,它知道分配的类型,而不仅仅是请求的大小?等同

c++ - operator new 的任何实现是否返回指向零大小数组保护页的指针?

相关:C++newint[0]--willitallocatememory?标准在5.3.4/7中说:Whenthevalueoftheexpressioninadirect-new-declaratoriszero,theallocationfunctioniscalledtoallocateanarraywithnoelements....并且,在3.7.3.1/2中:Theeffectofdereferencingapointerreturnedasarequestforzerosizeisundefined....但是,指针不能是空指针。由于实际取消引用指针是未定义的行为,是否

c++ - c++ 中表达式 new (&t) T(t) 的 &t 是什么意思?

C++中表达式new(&t)T(t)的&t是什么意思?如题。Tt;new(&t)T(t); 最佳答案 这被称为“placementnew”语法。T值在&t指定的地址中构造。此示例有点偏离,因为它使用复制构造函数在现有T的确切位置创建新T。我认为用一个明确的地址来解释这个概念更容易。这是此代码的变体。Tt;void*pAddress=malloc(sizeof(T));new(pAddress)T(t);//OrjustcreatingaTwithoutacopyctornew(pAddress)T();

c++ - 如果类有析构函数/delete[],则成员运算符 new[] 的参数 "size"增加

以下代码中的4个类:A、B、C和D。他们都有一个成员operatornew[]。此外,B有一个构造函数;C有析构函数;D有一个成员operatordelete[]。输出成员operatornew[]的参数size和4个类的sizeof:new[]A40new[]B40new[]C48new[]D48sizeof(A)4sizeof(B)4sizeof(C)4sizeof(D)4大小不同的原因是什么?代码(我知道很丑):#includeusingnamespacestd;classA{inti;public:staticvoid*operatornew[](std::size_tsize

c++ - 使用哪个 - "operator new"或 "operator new[]"- 在 C++ 中分配一 block 原始内存?

我的C++程序需要一block未初始化的内存和一个指向该block的void*指针,以便我可以将其提供给第三方库。我想将block生命周期的控制权交给库,所以我不想使用std::vector。当库完成block时,它将调用我必须提供的回调,这将释放block。在C语言中,我会使用malloc()和后来的free()。在C++中,我可以调用::operatornew或::operatornew[]和::operatordelete或operatordelete[]之后分别为:void*newBlock=::operatornew(sizeOfBlock);//then,later::op

C++ 重载 new[] 查询 : What size does it take as parameter?

我像这样重载了operatornew[]void*human::operatornew[](unsignedlongintcount){cout现在打电话human*h=newhuman[14];说sizeof(human)=16,但计算它打印出来的是232,也就是14*16+sizeof(int*)=224+8。为什么要分配这个额外的空间?它落在内存中的什么地方?因为当我打印*h或h[0]我得到相同的结果,所以它不在内存块的开头。它是否完全正确,或者我在这里遗漏了一些东西? 最佳答案 分配的额外空间用于存储内部使用的数组大小(在实

C++ 删除了 new 运算符但可以创建 shared_ptr

我试图寻找答案,但找不到任何有助于理解幕后发生的事情。假设我们有以下内容:classBase{public:virtualintrequest()=0;void*operatornew(longunsignedintsize)=delete;};classDerivedfinal:publicBase{public:intrequest()override;};intDerived::request(){return2;}在基类上,我删除了new运算符,因为我不想创建指针。我知道这可能没有任何意义,这只是一个实验。当我调用g++时,出现编译错误,告诉我新运算符已被删除。正是我所期望的。

c++ - operator new(n) 与 new unsigned char[n] 用于放置 new

我正在分配内存,稍后将用于构造具有放置new的对象。我应该使用operatornew(n),还是应该使用newunsignedchar[n]?为什么? 最佳答案 因素:new[]必须与delete[]/new()与delete匹配他们交流不同的东西。operatornew(n)是出于未指定目的的内存请求,而newunsignedchar[n]松散地暗示有意将字符存储在那里。数组形式可能稍微性能/效率较差-具体细节取决于您的实现:5.3.4/12newT[5]resultsinacallofoperatornewwherexisano

c++ - new[] 是否连续分配内存?

当我使用new[]关键字(或new-operator)时,它是否连续分配内存?int*arr=newint[10];我的意思是,是否可以保证arr[0]和arr[1]位置很近,并且我可以遍历arr使用指针增量?如果是这样,这种行为是否使用结构和类而不是int来保存? 最佳答案 C++标准绝对保证了这一点。arr[0]到arr[9]是连续的,元素之间不允许填充。指针算法在分配的区域中有效。您可以设置指向arr+10的指针,但不要取消引用它。这适用于任何类。每个元素分配的内存量是sizeof(Y),其中Y是类或普通旧数据类型。

c++ - std::allocator 构造/销毁与放置 new/p->~T()

对于我的一个项目,我正在从头开始编写一些STL容器(我有我的理由)。由于我非常接近地模仿STL的功能和接口(interface),所以我会尽最大努力遵守“如果它与标准结构同名,它将尽可能符合标准”的政策。所以,当然我的容器将分配器作为模板参数,这非常好,因为它允许一些自定义分配方案。关于我的问题。std::allocator接口(interface)将内存分配与对象构造分开。同样,它将释放与销毁分开。这是有道理的,因为从哪里获取内存与在C++中正确构造对象或多或少无关。所以有两个构造/释放函数,默认实现如下所示(直接从书中摘录):voidconstruct(pointerp,const