没有标准库的通用容器

Generic container without stdlib

本文关键字:标准      更新时间:2023-10-16

我正在尝试弄清楚如何使用没有stdlib的C++创建通用容器(gcc -nostdlib -nostartfiles(。我第一次遇到这样的问题,我什至想不出我该怎么做。我需要手动使用类似 std::vector 的东西,没有"运算符 new"。谁能给我只有 append((、at(( 和 remove(( 函数的源代码?谢谢!

问候。

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

我还假设您正在查看完整的内存管理(这是特定于平台的,因此如果您不想要任何C++内存运算符,这里有一个问题(,一个模板化类(再次,使用 std::vector 作为您的指南(。

您将查看各种构造函数,运算符,迭代器等,您可以在其中找到有关设计模式或堆栈溢出的宝贵信息。

例如,附加意味着您按顺序分配额外的内存,以便有一个连续的块(再次,取决于平台?

AT必须使用某种形式的簿记或索引,以及边界和内存检查。

删除与追加相同的一个。

希望这对您有任何帮助。

编辑:回答您的评论。

使用模板(例如 std::vector(您无需关心类型,管理其内存是类(或类型(的责任。

例如,您可以在 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);
     }
};

注意:上面的代码不是我的,不知道是不是有问题。取自这篇文章。在这种情况下,您将管理 Win32 堆管理的低级别 C 调用。请记住,这是一个棘手的领域。

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

_Ty array[number_of_objects];

或者,您可以查看链表(其中每个节点都有一个指向对象的指针和一个指向下一个节点的指针(,但这可能会降低连续内存性能。

第一站是实现各种内存管理运算符,可能是在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()是一个坏主意:掩盖错误的宽接口通常更像是一个问题而不是解决方案。