小编Pra*_*ari的帖子

用于STL映射的自定义内存分配器

这个问题是关于在插入std :: map期间构造自定义分配器的实例.

这是一个自定义分配器std::map<int,int>以及使用它的小程序:

#include <stddef.h>
#include <stdio.h>
#include <map>
#include <typeinfo>

class MyPool {
public:
  void * GetNext() {
    return malloc(24);
  }
  void Free(void *ptr) {
    free(ptr);
  }
};

template<typename T>
class MyPoolAlloc {
public:
  static MyPool *pMyPool;

  typedef size_t     size_type;
  typedef ptrdiff_t  difference_type;
  typedef T*         pointer;
  typedef const T*   const_pointer;
  typedef T&         reference;
  typedef const T&   const_reference;
  typedef T          value_type;

  template<typename X>
  struct rebind
  { typedef MyPoolAlloc<X> other; };

  MyPoolAlloc() throw() {
    printf("-------Alloc--CONSTRUCTOR--------%08x %32s\n", this, typeid(T).name()); …
Run Code Online (Sandbox Code Playgroud)

c++ memory-management stl map

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

使用STL的红黑树的内部实现

据我所知,我的STL(g ++ 4.xx附带)使用红黑树来实现地图等容器.是否可以直接使用STL的内部红黑树.如果是这样,怎么样?如果没有,为什么不 - 为什么STL不暴露红黑树?

令人惊讶的是,我无法使用谷歌找到答案.

编辑:我正在调查使用红黑树作为插入时额外的allocator构造函数调用的解决方案.看到这个问题.我的STL使用红黑树来实现地图.

c++ tree stl red-black-tree

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

插入地图时的内存分配

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <vector>
#include <string>
#include <iostream>
#include <map>
#include <utility>
#include <algorithm>

void * GetMemory(size_t n) {
  void *ptr = malloc(n);
  printf("getMem n %d   ptr 0x%x\n", n, reinterpret_cast<unsigned int> (ptr));
  return ptr;
}

void FreeMemory(void *p) {
  free(p);
}

void* operator new (size_t n) {
  void *p = GetMemory(n);
  return p;
}

void* operator new [] (size_t n) {
  void *p = GetMemory(n);
  return p;
}

void operator delete (void *p) {
  FreeMemory(p);
} …
Run Code Online (Sandbox Code Playgroud)

c++ memory allocation insert map

7
推荐指数
2
解决办法
2037
查看次数

为什么我不能创建std :: ifstreams的std :: stack?

为什么以下不起作用:

#include <iostream>
#include <fstream>
#include <stack>

std::stack<std::ifstream> s;
Run Code Online (Sandbox Code Playgroud)

-PT

c++ stack iostream stl ifstream

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

具有固定插入次数的Map的内存分配

我想在地图中插入n个元素,其中n是提前知道的.我不想在每次插入时分配内存.我想在开始时分配所有内存.有没有办法做到这一点?如果是这样,怎么样?写一些内存分配器会有帮助吗?

我运行了GMan的代码并获得了以下输出.通过调用"new"打印GetMem,并从调用delete打印FreeMem.size是请求的字节数,ptr是返回的指针.显然,在插入期间正在进行分配/解除分配.你怎么解释这个?

GetMem大小40,ptr 0x8420008
GetMem大小40,ptr 0x8420038
GetMem大小120,ptr 0x8420068
GetMem大小120,ptr 0x84200e8
FreeMem ptr 0x8420068
FreeMem ptr 0x8420038
FreeMem ptr 0x8420008
插入:[0,0]
GetMem大小40,ptr 0x8420008
FreeMem ptr 0x8420008
插入:[1,2]
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
插入:[2,4]
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
插入:[3,6]
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
插入:[ 4,8]
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
插入:[5,10]
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
GetMem例程大小40 ,PTR 0x8420008
freemem在PTR 0x8420008
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
freemem在PTR 0x84200e8
St9bad_alloc

c++ memory stl allocation map

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

为什么每秒非自愿上下文切换?

操作系统是RHEL 6(2.6.32).我已经隔离了一个核心,并在其上运行计算密集型线程./ proc/{thread-id}/status每秒显示一个非自愿的上下文切换.

有问题的线程是一个SCHED_NORMAL线程,我不想改变它.

如何减少这种非自愿上下文切换的数量?这取决于/ proc/sys/kernel中的任何调度参数吗?

编辑:一些回复提出了替代方法.在走这条路之前,我首先要了解为什么即使经过几个小时的运行,我每秒也会获得一次非自愿的上下文切换.例如,这是由CFS引起的吗?如果是这样,哪些参数又如何?

EDIT2:进一步澄清 - 我想回答的第一个问题如下:为什么我每秒钟进行一次非自愿的上下文切换,而不是每半秒或两秒钟进行一次切换?

operating-system kernel scheduling linux-kernel

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