我正在试图弄清楚如何在没有stdlib(gcc -nostdlib -nostartfiles)的情况下使用C ++创建通用容器。我第一次遇到这样的问题,我甚至想不出怎么办呢。我手动需要像std :: vector这样的东西,没有“operator new”。任何人都可以给我一些只有append(),at()和remove()函数的源代码吗?谢谢!
问候。
答案 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()
是一个坏主意:广泛的界面掩盖错误通常比解决方案更具问题。