这个问题是关于在插入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) 据我所知,我的STL(g ++ 4.xx附带)使用红黑树来实现地图等容器.是否可以直接使用STL的内部红黑树.如果是这样,怎么样?如果没有,为什么不 - 为什么STL不暴露红黑树?
令人惊讶的是,我无法使用谷歌找到答案.
编辑:我正在调查使用红黑树作为插入时额外的allocator构造函数调用的解决方案.看到这个问题.我的STL使用红黑树来实现地图.
#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) 为什么以下不起作用:
#include <iostream>
#include <fstream>
#include <stack>
std::stack<std::ifstream> s;
Run Code Online (Sandbox Code Playgroud)
-PT
我想在地图中插入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
操作系统是RHEL 6(2.6.32).我已经隔离了一个核心,并在其上运行计算密集型线程./ proc/{thread-id}/status每秒显示一个非自愿的上下文切换.
有问题的线程是一个SCHED_NORMAL线程,我不想改变它.
如何减少这种非自愿上下文切换的数量?这取决于/ proc/sys/kernel中的任何调度参数吗?
编辑:一些回复提出了替代方法.在走这条路之前,我首先要了解为什么即使经过几个小时的运行,我每秒也会获得一次非自愿的上下文切换.例如,这是由CFS引起的吗?如果是这样,哪些参数又如何?
EDIT2:进一步澄清 - 我想回答的第一个问题如下:为什么我每秒钟进行一次非自愿的上下文切换,而不是每半秒或两秒钟进行一次切换?
c++ ×5
stl ×4
map ×3
allocation ×2
memory ×2
ifstream ×1
insert ×1
iostream ×1
kernel ×1
linux-kernel ×1
scheduling ×1
stack ×1
tree ×1