问题标签 [placement-new]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 使用 C++ 的“新位置”进行动态分配
问题:如何使用“ placement new ”来创建具有动态大小的数组?或者更具体地说,如何从预先分配的内存中为数组元素分配内存。
我正在使用以下代码:
这保证了 final_array*(数组指针)是从 void_array* 保留的位置分配的。但是 final_array 元素呢?我希望它们也从预先分配的内存中分配。
PS:我不得不说我正在使用一些 API,这些 API 可以让我对 tile 架构进行一些控制。有一个功能与 malloc 完全一样,但还有其他功能,例如让您控制已分配内存的属性。所以,我基本上需要做的是使用类似 malloc 的函数来分配具有我想要的属性的内存(例如,从哪个内存库,在哪里缓存等等)
c++ - 放置新的和私有的构造函数
我有一个使用新位置的自定义内存分配器。然后我有一个具有私有构造函数的类,当我尝试使用我的内存分配器时,它抱怨构造函数是私有的。
这是我的函数,它分配内存并使用placement new调用构造函数:
这是我要分配的课程:
如前所述,错误是error C2248: 'Mesh::Mesh' : cannot access private member declared in class 'Mesh'
有没有好的方法解决这个问题?
c++ - 如何将一大块内存直接读入std::vector?
我有一个来自文件x
的巨大连续数组。fread
如何将此块放入std::vector<>
? 换句话说,我更喜欢将结果放入std::vector<>
而不是数组,但我希望生成的 C++ 代码与将块直接放入数组的纯 C 版本一样高效。
通过搜索,我想我可能不得不以某种形式使用placement-new,但我不确定调用顺序和所有权问题。另外,我需要担心对齐问题吗?
我正在测试 with T = unsigned
,但我希望有一个合理的解决方案适用于任何 POD 结构。
c++ - 放置新的和未初始化的 POD 成员
C++ 标准是否保证未初始化的 POD 成员在放置 new 后保留其先前的值?
或者更准确地说,根据 C++11 是否总是满足以下断言?
C++03的答案是否相同?
c++ - c++11类成员数组大小constexpr前向声明
我想在使用它们之后从我的包含链中排除一些标题。据我所知,c ++ 11中没有排除“header.h”。
伪代码一厢情愿:
我的问题变得明显的例子如下。请不要争辩这不是一个严重的问题。该示例被分解以显示最小的抽象语言使用。我还将描述老式的解决方案及其缺点。
旧式解决方案
只是另一个header.h:
只是另一个cppunit.cpp:
我目前的解决方案
只是另一个header.h:
只是另一个cppunit.cpp:
因此,上面的代码正在运行。优点是:隐藏复杂性并且没有运行时动态内存间接。嗯?我的意思是,放置 new 允许将整个对象放在堆栈上,并且所有成员地址在编译时都是已知的。我的尝试是在使用不透明指针的界面设计时获得最佳性能。
如果您认为:“这种性能优势不值得思考。” 那么请留下这个问题。
我预期的解决方案
只是另一个header.h:
只是另一个cppunit.cpp:
在我当前的解决方案中,我需要验证 sizeof(bulkywrap_pImpl) 并手动调整 UNKNOWNSIZE。我认为目前无法从编译单元获取任何信息给其他人。我知道这通常是有充分理由的,但这限制了 c++11 的可能性。
我想指出:
请帮我查找信息天气以及为什么标准不允许这样做。
但此外,我想找到一种解决方案,如何在编译期间将一些文字常量从一个编译单元导出到另一个编译单元。它只是一个文字,所以所有的语句和表达式都不受它的影响。因此编译不依赖于数组的大小来自哪里。
我的建议为 ISO-jtc1-sc22-wg21 和编译器开发人员带来了一些工作,但我没有看到模板和 constexpr 之间有任何相关差异,因为每个定义都必须出现在同一个翻译单元中。这使得模块化编程和干净的接口变得虚假。
不:我不想使用预处理器宏、动态新函数或虚拟成员函数。重要的是最大的 const 正确性,因为类的大小是 const。
请帮忙
c++ - 模板化放置 new 和析构函数
为什么不编译?
我显然想要实现的是在原始内存数组上调用placement new(应该调用构造函数ok)。然后我想调用数组中项目的析构函数和构造函数。问题是 Item 是模板,所以如果我使用
编译器期望找到“FooBar()”和“~FooBar()”而不是“T()”和“~T()”。有什么特殊的语法可以做到这一点吗?
我使用的是C++03而不是 C++11
c++ - 放置新以避免复制构造函数
我有一个简单的类,其中包含一个指向它自己的成员之一的指针:
我有一些这样的代码:
我担心当 x 被重新分配时,如果没有发生返回值优化,x.pVal
将无效地指向临时成员。X(2)
我意识到我可以编写一个复制构造函数来解决这个问题。然而,一开始就进行复制似乎很浪费,而不是在一开始就在内存中的正确位置构建对象。
在这里使用placement new 操作符是否合理?或者这会对析构函数产生意想不到的后果?
c++ - boost中的load_construct_data:放置新的问题
我尝试在 boost 的帮助下使用非默认构造函数序列化派生指针类。
在编译过程中我得到一个错误:
我包括<new>
到Derived.h
,但我有一种我忘记做某事的感觉。这是我对代码的粗略估计。
我有一个带有虚函数和非默认构造函数的基类(在 Base.h 中)
有一个派生类(在 Derived.h 中)
在 main.cpp 的某个地方我想保存和加载派生类。所以,我一开始提到的编译错误阻止了我继续。
任何提示我缺少什么?
c++ - 使用 std::list 放置新
我正在寻求实现一个(双重)链表,它只在内部调用placement new
,将所有内存定向到分配有类似以下内容的池:
最初我打算实现我自己的类,它需要一个指向(管理一个)预分配内存池的指针。但是,我想首先确定我无法使用std::list
. 特别是,大卫罗德里格斯对这个 SO 问题的回答的第三部分让我感到担忧。
std::list
必须在其组件节点上调用new
and是有道理delete
的,但我想修改此行为,以便将所有节点分配placement new
到我的自定义池中。因此我的问题是:
有没有办法指定一个placement new
std::list
如:
还应该使用自定义分配器分配其节点,以便所有内容都严格存储在我自己的内存池中?
(注意:我知道shared_ptrs
如果我也想在自定义内存池中使用自定义分配/删除函数。)
c++ - 这样的赋值在 C++ 中是个好主意吗
许多类的赋值运算符(operator=)与析构函数中的代码相同,并且与复制构造函数的代码非常相似。
那么以这种方式实施分配是个好主意吗?