没有标准库的通用容器
Generic container without stdlib
我正在尝试弄清楚如何使用没有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()
是一个坏主意:掩盖错误的宽接口通常更像是一个问题而不是解决方案。
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 标准库类型的赋值运算符的引用限定符
- 标准是否严格定义了该程序应该如何编译?
- 如何从Windows应用程序输出到标准?
- 安全到标准:移动会员?
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 这是否符合C++标准:双响双响,例如!!(-0.0).
- 标准::变体的赋值运算符
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 如何在 Mac 上使用 c++17 并行标准库算法?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 并行标准::复制复杂性