我有一个大型(> 250个文件)库的源,它大量使用STL容器和字符串.我需要在有限堆的嵌入式环境中运行它,所以我想确保这个库本身在其堆使用方面受到限制.
显而易见的解决方案是创建一个分配器,但是修改整个代码库以包含分配器模板参数是最后的一项重要工作,如果我想要使用新版本的源,这是不可取的.全局替换new和delete是不可行的,因为这会影响整个图像,而不仅仅是这个库.
我的下一个想法是一个愚蠢的C宏技巧,但这似乎不太可能,虽然我承认不是一个聪明的宏作者.
所以我认为"在编译时是否有编译器或编译指示开关来指定allocator <>类"?但我对任何事情都持开放态度.
我要问的下一个问题是,如果有人能提出解决方案,那么如何在包含该库的文件集中对新/删除做同样的事情.
我正在使用gcc 3.4.4工具链在Cygwin下运行它,目标是VxWorks,如果这引发了任何想法.
我使用预处理器来获得可能的解决方案,尽管它目前依赖于GCC 3.4.4实现来工作.
GCC <memory>实现包括该文件<bits/allocator.h>,该文件又包含另一个文件<bits/c++allocator.h>,该文件定义了一个宏,该宏定义了实现默认分配器基类的类.
既然是在一个依赖于平台的路径(/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/i686-pc-cygwin/bits)中找到的,我在用自己的"依赖于平台"的实现来取代它时并不觉得(非常)肮脏.
所以我只是bits/在源的包含路径的根目录中创建一个文件夹,然后c++allocator.h在该文件夹中创建该文件.我将所需的宏定义为我的allocator类的名称,它就像一个魅力,因为gcc在搜索系统包括之前搜索我的包含路径.
感谢您的所有回复.我想我可以使用这个"解决方案",只有在我使用3.4.4时它才会起作用.
您可以从使用EASTL(Enterprise Arts STL(部分)实现)中受益
这适用于嵌入式/游戏开发,在全球堆非常稀缺,不存在或一般存在问题的环境中.
EASTL的分配器模型的灵感来自(或类似于)着名的" 走向更好的分配器模型"出版物(PDF)中的想法.
EASTL非常适合自定义分配器.事实上,它不与分配出货,所以提供(最小的)一个要求,甚至让你的应用程序链接.
这是EASTL的github回购:https://github.com/paulhodge/EASTL
| 归档时间: |
|
| 查看次数: |
6491 次 |
| 最近记录: |