没有stdlib的通用容器

时间:2013-09-26 15:43:50

标签: c++ vector

我正在试图弄清楚如何在没有stdlib(gcc -nostdlib -nostartfiles)的情况下使用C ++创建通用容器。我第一次遇到这样的问题,我甚至想不出怎么办呢。我手动需要像std :: vector这样的东西,没有“operator new”。任何人都可以给我一些只有append(),at()和remove()函数的源代码吗?谢谢!

问候。

2 个答案:

答案 0 :(得分:1)

我认为你应该把std :: vector作为你的指导(如果你正在寻找一个动态容器)或std :: array。

我还假设您正在考虑完整的内存管理(这是特定于平台的,所以如果您不需要任何C ++内存运算符,这是一个问题),一个模板化的类(再次,使用std :: vector作为你的指导方针)。

您将查看各种构造函数,运算符,迭代器等,您可以在其中找到有关Design Patterns或stackoverflow的宝贵信息。

例如,

追加意味着你按顺序分配额外的内存,以便有一个连续的块(同样,平台依赖?)。

必须使用某种形式的簿记或索引,并进行边界和内存检查。

删除与追加相同的内容。

希望这对你有任何帮助。

编辑:回答您的评论。

使用模板(例如std :: vector确实)你不需要关心类型,它的类(或Type)负责管理它的内存。

你在Win32中可以做的是:

 template<class _Ty>
 class w32Allocator
 {
     // deallocate object at _Ptr, ignore size
     void deallocate(pointer _Ptr, size_type) 
     {
         VirtualFree(_Ptr, 0, MEM_FREE);
     }

     // allocate array of _Count elements
     pointer allocate(size_type _Count)
     {
         return (pointer)VirtualAlloc(NULL, sizeof(_Ty) * _Count, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
     }
};
注意:上面的代码不是我的,不知道它的bug。取自this post。 在这种情况下,您正在管理对Win32堆管理的低级C调用。 请记住这是一个棘手的领域。

然后你只需要担心_Ty类型的数组,即如果它是一个连续数组(非动态):

_Ty array[number_of_objects];

或者,您可以查看链接列表(每个节点都有一个指向您对象的指针,以及指向下一个节点的指针),但这可能会阻止连续的内存性能。

答案 1 :(得分:0)

第一站是实现各种内存管理运算符,可能是malloc()free()(如果你不能使用这些运算符,事情会变得更有趣):

void* operator new(std::size_t size) {
    return malloc(size);
}
void* operator new[](std::size_t size) {
    return malloc(size);
}
void operator delete(void* ptr) {
    free(ptr);
}
void operator delete[](void* ptr) {
    free(ptr);
}

获得这些后,您就可以开始正常分配内存了。即使您要求的一小组操作,写一个std::vector<T>也应该是一个简单的练习。但请注意,使用at()是一个坏主意:广泛的界面掩盖错误通常比解决方案更具问题。