相关疑难解决方法(0)

在C++中使用std :: allocator而不是new有什么好处?

我刚看过std::allocator.在我看来,使用它而不是使用new和更复杂delete.

随着allocator我们必须明确分配堆内存,构建它,消灭它,然后终于解除分配内存.那它为什么会被创造出来?

在哪些情况下可以使用它何时应该使用而不是新的和删除?

c++ heap alloc

63
推荐指数
7
解决办法
1万
查看次数

英特尔TBB的Scalable_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减少的运行时间.

c++ malloc multithreading stl tbb

27
推荐指数
1
解决办法
2万
查看次数

C++:指针向量在push_back()之后失去引用

在我的代码中,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++ pointers vector

13
推荐指数
3
解决办法
6069
查看次数

多线程堆管理

在C/C++中,我可以在一个线程中分配内存并在另一个线程中删除它.然而,每当从堆请求内存时,堆分配器需要遍历堆以找到适当大小的空闲区域.两个线程如何在不破坏堆的情况下有效地访问同一个堆?(这是通过锁定堆来完成的吗?)

memory heap operating-system

11
推荐指数
1
解决办法
7431
查看次数

我可以使用std :: vector作为预分配(原始)数组的外观吗?

我从DirectX获取了存储顶点信息的存储位置.处理顶点信息的一种非常方便的方法是使用包含顶点信息的结构的std :: vector <>.

鉴于我有一个指向大缓冲区的指针,我可以使用std :: vector来管理缓冲区中的元素吗?经常构造一个std :: vector使它有自己的地址,这不是我想要的.我可以以某种方式使用操作员放置吗?

c++ vector facade memory-address

10
推荐指数
1
解决办法
2434
查看次数

什么是分配器以及何时需要使用它们?

在阅读有关C++和标准库的书籍时,我看到频繁引用分配器.

例如,Nicolai Josuttis的C++标准库在最后一章中详细讨论了它们,并且第2项("了解分配器的约定和限制")和11("理解自定义分配器的合法用途")在Scott Meyers的有效的STL是关于它们的使用.

我的问题是,分配器如何代表一个特殊的内存模型?默认的STL内存管理不够吗?何时应该使用分配器?

如果可能,请使用简单的内存模型示例进行说明.

c++ stl allocator

10
推荐指数
1
解决办法
924
查看次数

STL Vector默认使用'new'和'delete'进行内存分配吗?

我正在为应用程序创建一个插件,其中应该由应用程序分配内存并跟踪它.因此,应该以缓冲区的形式从宿主应用程序获取内存句柄,然后将它们返回给应用程序.现在,我正计划使用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)

c++ memory stl allocation vector

9
推荐指数
2
解决办法
4657
查看次数

我们可以创建一个大小为执行时常量的静态数组吗?

我们都知道静态数组的基本规则:

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似乎编译并执行它很好.

显然,它不便携,但应该被接受吗?

在那种情况下哪个编译器做对了?

此外,如果编译器允许它,是否应该通过良好的编程标准/实践进行授权?

编辑:我的想法是我想要速度的堆栈分配,但我不知道在编译时数组的大小.我知道还有其他一些解决方案,堆栈分配可能不是一个有意义的优化,但我认为这是一个有趣的用法.

c++ coding-style static-array

6
推荐指数
1
解决办法
1180
查看次数

通过new和allocator分配内存有什么区别

通过new/ malloc和内存分配有什么区别allocator

为什么我们永远需要载体的独立内存分配器,如果我们的选择newmalloc

c++ memory-management stl allocator

5
推荐指数
1
解决办法
649
查看次数

vector如何使用默认分配器?

当我研究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++

5
推荐指数
1
解决办法
611
查看次数

静态内存中的动态结构?

假设您已经分配了一个固定的内存区域,那么C或C++库将允许您在该内存中存储动态结构(例如哈希)?

即,哈希库不得包含对malloc或new的任何调用,但必须使用一个参数来告诉它允许使用的内存的位置和大小.

(如果库使用偏移而不是内部指针,以防共享内存映射到使用它的每个进程中的不同地址空间)

c c++ memory-management

2
推荐指数
1
解决办法
437
查看次数

覆盖标准库使用的内存分配方法?

是否可以覆盖 STL 分配、管理和释放内存的方式?如果可能的话,怎么做呢?有没有一种方法可以将处理原始内存的代码保留在一个类或文件中?

我想为我的整个程序执行此操作,以便我可以跟踪内存使用情况、时间和生命周期信息。当然纯粹是出于好奇!

c++ memory-management stl

2
推荐指数
1
解决办法
4384
查看次数