我刚看过std::allocator.在我看来,使用它而不是使用new和更复杂delete.
随着allocator我们必须明确分配堆内存,构建它,消灭它,然后终于解除分配内存.那它为什么会被创造出来?
在哪些情况下可以使用它何时应该使用而不是新的和删除?
什么是tbb::scalable_allocator英特尔线程构建模块实际上是引擎盖下呢?
它肯定是有效的.我刚用它来采取25%的折扣的应用程式的执行时间(并看到在CPU利用率从〜200%4核系统上增加至350%),通过改变单个std::vector<T>给std::vector<T,tbb::scalable_allocator<T> >.另一方面,在另一个应用程序中,我看到它将已经很大的内存消耗加倍并将内容发送到交换城市.
英特尔自己的文档并没有给出太多帮助(例如本常见问题解答末尾的简短部分 ).在我自己去挖掘代码之前,谁能告诉我它使用了什么技巧?
更新:刚刚第一次使用TBB 3.0,并且从Scalable_allocator看到了我最好的加速.改变单一vector<int>的vector<int,scalable_allocator<int> >(从测试的Debian莱尼,核2,与TBB 3.0)的从85S东西35S减少的运行时间.
在我的代码中,a有一个Node对象的全局向量和一个Node指针的局部向量:
#include<cstdio>
#include<cstdlib>
#include<vector>
using namespace std;
class Node {
int n;
public:
Node(int i) : n(i);
int getN() { return n; }
};
vector<Node> v;
int main() {
vector<Node*> p;
v.push_back(Node(1));
p.push_back(&v[0]);
printf("first node id : %d\n", (*p[0]).getN());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我将一个节点对象插入到全局向量中,并将该对象的指针插入到本地向量中.我上面代码的输出是:
first node id : 1
Run Code Online (Sandbox Code Playgroud)
但是,如果我将主要功能更改为:
int main()
{
vector<Node*> p;
v.push_back(Node(1));
p.push_back(&v[0]);
v.push_back(Node(2));
p.push_back(&v[1]);
printf("first node id : %d\n", (*p[0]).getN());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码打印垃圾值:
first node id : 32390176
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚这个问题.vector插入后数据结构是否会更改每个对象的引用?我怎样才能解决这个问题 ?
在C/C++中,我可以在一个线程中分配内存并在另一个线程中删除它.然而,每当从堆请求内存时,堆分配器需要遍历堆以找到适当大小的空闲区域.两个线程如何在不破坏堆的情况下有效地访问同一个堆?(这是通过锁定堆来完成的吗?)
我从DirectX获取了存储顶点信息的存储位置.处理顶点信息的一种非常方便的方法是使用包含顶点信息的结构的std :: vector <>.
鉴于我有一个指向大缓冲区的指针,我可以使用std :: vector来管理缓冲区中的元素吗?经常构造一个std :: vector使它有自己的地址,这不是我想要的.我可以以某种方式使用操作员放置吗?
在阅读有关C++和标准库的书籍时,我看到频繁引用分配器.
例如,Nicolai Josuttis的C++标准库在最后一章中详细讨论了它们,并且第2项("了解分配器的约定和限制")和11("理解自定义分配器的合法用途")在Scott Meyers的有效的STL是关于它们的使用.
我的问题是,分配器如何代表一个特殊的内存模型?默认的STL内存管理不够吗?何时应该使用分配器?
如果可能,请使用简单的内存模型示例进行说明.
我正在为应用程序创建一个插件,其中应该由应用程序分配内存并跟踪它.因此,应该以缓冲区的形式从宿主应用程序获取内存句柄,然后将它们返回给应用程序.现在,我正计划使用STL Vectors,我想知道它在内部使用什么样的内存分配.
它是否在内部使用"新"和"删除"功能?如果是这样,我可以用自己的函数重载'new'和'delete'吗?或者我应该创建自己的模板分配器,这对我来说看起来很困难,因为我没有创建自定义模板的经验.
欢迎任何建议/示例代码.可以从这样的应用程序中获取内存句柄
void* bufferH = NULL;
bufferH = MemReg()->New_Mem_Handle(size_of_buffer);
MemReg()->Dispose_Mem_Handle(bufferH); //Dispose it
Run Code Online (Sandbox Code Playgroud) 我们都知道静态数组的基本规则:
int size = 20;
char myArray[size];
Run Code Online (Sandbox Code Playgroud)
不合法.和.
const int size = 20;
char myArray[size];
Run Code Online (Sandbox Code Playgroud)
没关系
但是,这个怎么样.
int f(const int size)
{
char myArr[size];
}
void main()
{
f(2);
f(1024);
}
Run Code Online (Sandbox Code Playgroud)
MSVC说它是一个错误,gcc似乎编译并执行它很好.
显然,它不便携,但应该被接受吗?
在那种情况下哪个编译器做对了?
此外,如果编译器允许它,是否应该通过良好的编程标准/实践进行授权?
编辑:我的想法是我想要速度的堆栈分配,但我不知道在编译时数组的大小.我知道还有其他一些解决方案,堆栈分配可能不是一个有意义的优化,但我认为这是一个有趣的用法.
通过new/ malloc和内存分配有什么区别allocator?
为什么我们永远需要载体的独立内存分配器,如果我们的选择new和malloc?
当我研究STL时,我已经通过分配器,我在互联网上发现了很多东西,或多或少我理解他们做了什么.我看过一个Custom Allocator来看看它们是如何实现的,但我的问题是它们是如何被容器使用的,让我们说到Vector中?
他们总是说vector正在使用DEFAULT Allocator.例如,空向量构造函数是:
explicit vector (const allocator& alloc = allocator());
Run Code Online (Sandbox Code Playgroud)
但是vector如何使用allocator?
在场景后面的vector何时何地使用Allocator :: allocate()和Allocator :: construct()?
知道了,为什么需要自定义分配器,它会改变什么?
假设您已经分配了一个固定的内存区域,那么C或C++库将允许您在该内存中存储动态结构(例如哈希)?
即,哈希库不得包含对malloc或new的任何调用,但必须使用一个参数来告诉它允许使用的内存的位置和大小.
(如果库使用偏移而不是内部指针,以防共享内存映射到使用它的每个进程中的不同地址空间)
是否可以覆盖 STL 分配、管理和释放内存的方式?如果可能的话,怎么做呢?有没有一种方法可以将处理原始内存的代码保留在一个类或文件中?
我想为我的整个程序执行此操作,以便我可以跟踪内存使用情况、时间和生命周期信息。当然纯粹是出于好奇!
c++ ×11
stl ×5
vector ×3
allocator ×2
heap ×2
memory ×2
alloc ×1
allocation ×1
c ×1
coding-style ×1
facade ×1
malloc ×1
pointers ×1
static-array ×1
tbb ×1