我将使用stackoverflow上的链接列表示例代码来说明问题。
我的c ++编写的progam(x64)包含这个链表代码:
旧代码片段已删除;对不起,如果评论不再有意义。
添加了完整的工作代码以显示我的问题。 编译:g ++ linkedlist.cpp -o linked-list
#include <cstdlib>
#include <iostream>
using namespace std;
struct node
{
public :
unsigned int part1; // 4 bytes
unsigned int part2; // 4 bytes
node *next; //pointer, 8 bytes on 64 bit system
unsigned int read_part1();
};
struct LinkedList
{
public:
LinkedList();
void insert(unsigned int data[], unsigned int data1);
bool isEmpty() const;
node* head;
};
unsigned int node::read_part1() {
return part1;
}
LinkedList::LinkedList():
head(NULL)
{
}
bool LinkedList::isEmpty() const
{
return (head == NULL);
}
void LinkedList::insert(unsigned int data[], unsigned int data1)
{
node* oldHead = head;
node* newHead = new node();
newHead->part1 = data[0];
newHead->part2 = data1;
newHead->next = oldHead;
head = newHead;
}
unsigned int allocations = 300000000;
unsigned int index_size = 430000000;//index of lists, 430m,.
//will be creatad on heap
LinkedList *list = NULL;
int main(int argc, char *argv[])
{
LinkedList list_instance;
cout << "1 LinkedList instance takes [" << sizeof(list_instance) << "] bytes in memory!"<< endl;
node node_instance;
cout << "1 node instance takes [" << sizeof(node_instance) <<"] bytes in memory !"<< endl;
try{
list = new LinkedList[index_size];
}
catch(std::bad_alloc) {
cout << "Error allocating memory" << endl;
return 0;
//reboot code
}
unsigned int some_data[] = {00, 01};
unsigned int index;
LinkedList *list_instance2 = NULL;
cout << "Allocating ..." << endl;
for (int i=0; i<allocations; i++)
{
index = rand();
unsigned short inde = (unsigned short)index;
list_instance2 = &list[inde];
list_instance2->insert(some_data, some_data[1]);
}
unsigned long sk = ((allocations * sizeof(node_instance) + index_size*sizeof(list_instance))) / (1024*1024*1024);
cout << "This process *should* consume around " << sk <<" GBytes of memory, but does it ?"<< endl;
cout << "Allocating done, *check the process size* and press any number key + ENTER to exit ..." << endl;
int u=0;
cin >> u;
return 0;
}
编译它,运行它,看看你的进程大小是否远远与预期的匹配。 如果不是 - 问题出在哪里?
哦,我使用未经修改的默认内核在64位slackware 13.37上运行它。
答案 0 :(得分:1)
在我的包装盒上,slightly modified source(见下文附注)
在堆例程的实现中,开销很明显。
以下是代码:
new (nothrow)
。pmap $(pgrep test) | tail
)请注意insert
中的选择:
void LinkedList::insert(unsigned int data[], unsigned int data1)
{
#if 1
head = new node { data[0], data1, head };
#else
static boost::object_pool<node> node_pool;
node* add = node_pool.malloc();
*add = node { data[0], data1, head };
head = add;
#endif
}
将#if 1
更改为#if 0
以使用Boost对象池
节点分配循环中存在一种奇怪的现象
index = rand();
unsigned short inde = (unsigned short)index;
list_instance2 = &list[inde];
list_instance2->insert(some_data, some_data[1]);
我把它改成了你想要的东西:
list[rand() % index_size].insert(some_data, some_data[1]);
#include <stdlib.h>
#include <iostream>
#include <boost/pool/object_pool.hpp>
using namespace std;
struct node
{
unsigned int part1; // 4 bytes
unsigned int part2; // 4 bytes
node *next; //pointer, 8 bytes on 64 bit system
};
struct LinkedList
{
public:
LinkedList();
void insert(unsigned int data[], unsigned int data1);
bool isEmpty() const;
node* head;
};
LinkedList::LinkedList():
head(NULL)
{
}
bool LinkedList::isEmpty() const
{
return (head == NULL);
}
void LinkedList::insert(unsigned int data[], unsigned int data1)
{
#if 1
head = new node { data[0], data1, head };
#else
static boost::object_pool<node> node_pool;
node* add = node_pool.malloc();
*add = node { data[0], data1, head };
head = add;
#endif
}
const unsigned int allocations = 30000000;
const unsigned int index_size = 43000000;//index of lists
//will be creatad on heap
LinkedList *list = NULL;
int main(int argc, char *argv[])
{
LinkedList list_instance;
cout << "1 LinkedList instance takes [" << sizeof(list_instance) << "] bytes in memory!"<< endl;
node node_instance;
cout << "1 node instance takes [" << sizeof(node_instance) <<"] bytes in memory !"<< endl;
cout << "Before dynamic allocations: *check the baseline process size* and press ENTER to start allocating ..." << endl;
std::string s;
std::getline(std::cin, s);
list = new (nothrow) LinkedList[index_size];
if (!list)
{
cout << "Error allocating memory" << endl;
return 1;
}
unsigned int some_data[] = {00, 01};
cout << "Allocating nodes ..." << endl;
for (unsigned int i=0; i<allocations; i++)
{
list[rand() % index_size].insert(some_data, some_data[1]);
}
unsigned long sk = ((allocations * sizeof(node_instance) + index_size*sizeof(list_instance))) >> 20;
cout << "This process *should* consume around " << sk <<" MiB of memory, but does it ?"<< endl;
cout << "Allocating done, *check the process size* and press ENTER to exit ..." << endl;
std::getline(std::cin, s);
return 0;
}