【发布时间】:2011-11-23 18:53:27
【问题描述】:
我有一个大量使用 STL 容器和字符串的大型(>250 个文件)库的源代码。我需要在有限堆的嵌入式环境中运行它,所以我想确保这个库本身的堆使用受到限制。
显而易见的解决方案是创建一个分配器,但是修改整个代码库以包含分配器模板参数是最后的一项大工作,如果我想要获取新版本的源代码,这也是不可取的。全局替换 new 和 delete 是不可行的,因为这会影响整个图像,而不仅仅是这个库。
我的下一个想法是一个愚蠢的 C 宏技巧,但这似乎是不可能的,尽管我承认自己不是一个聪明的宏作者。
所以我想“是否有编译器或编译指示开关在编译时指定分配器 类”?但我愿意接受任何事情。
如果有人能提出解决方案,我要问的下一个问题是,如何在包含此库的文件集中对 new/delete 执行相同的操作。
我正在使用 gcc 3.4.4 工具链在 Cygwin 下运行它,目标是 VxWorks,如果这能激发任何想法的话。
【问题讨论】:
-
gcc 3.4.4 这已经够老了,可以贴上“完全损坏”的标签。你有什么理由不切换到新版本?
-
我认为在 GCC 中这只是内部某个地方的一个简单宏,您应该可以切换它。默认是“新分配器”,但 GCC 提供了几个替代方案,例如“malloc 分配器”和池分配器等等。
-
假设您可以创建一个有限堆,然后仅为该库重载
operator new,因此库中的所有operator new调用都转到您的有限堆。当有限的堆已满并调用重载的operator new时,您想要什么行为?你真的希望operator new在这种情况下失败吗?我不相信你会,除非当operator new失败时该库仍然可以运行。也许如果库是数据库缓存或类似的东西。图书馆是做什么的? -
我们这样做的方式是创建一个模板类来包装我们使用的每个容器。看看我发布的一个问题:stackoverflow.com/q/8248076/1037208。它为您节省了一些麻烦,并使您更难犯错误。我对我们的解决方案并不完全满意,所以如果有人用更好的解决方案回答您的问题,我可能会考虑修改我们的解决方案。
-
@sehe,3.4.4 的原因是我们的目标系统是运行 VxWorks 的卫星硬件,而该工具链仍在 3.4.4 上。我不知道“为什么”,只是要求。