如何强制库使用自定义 std::allocator?

Posted

技术标签:

【中文标题】如何强制库使用自定义 std::allocator?【英文标题】:How to force a Library to use custom std::allocator? 【发布时间】:2011-09-18 02:15:14 【问题描述】:

我正在使用 SFML,它通过std::vector<Uint32> 和其他类似的类型处理大部分内存。所有声明都使用默认分配器。 SFML 库被编译成在 Visual Studio 中静态链接的 .lib 文件。 (如果需要,我拥有它的所有源代码。)

我的问题是,强制 SFML 将我的自定义小对象/线程安全分配器用于 STL 容器而不是默认的分配器,最不痛苦的方法是什么?我需要更改库本身的次数越少,当然越好!

编辑

如果有帮助,请忘记库的实现;我可以随心所欲地重新编译它。为了这个问题,想象这是我正在使用的代码。我的目标是从本质上更改所有 STL 容器使用的默认分配器。

编辑2

如果这根本不可能,那么覆盖new 本身是否是一种合适的方法?我读到过,默认分配器只不过是新/删除操作上的糖衣。

【问题讨论】:

"custom std::allocator" 有点用词不当。如果是定制的,那就不是标准的。 SFML 肯定使用std::vector<Uint32, std::allocator<Uint32>> 【参考方案1】:

嗯,最“蛮力”或万无一失的方法似乎是创建一个实现 malloc/free(和朋友?)的预加载库。

这通常是堆调试器/边界检查器的操作方式。

但是,我对 SFML 分配器的要求一无所知,因此如果空间非常有限,它可能无法工作。在这种情况下,我建议在需要时将数据“编组”(用于复制的花哨词)到自定义分配的区域

切线相关:

Electronics Art 拥有用于游戏开发的 STL“端口”。它非常适合自定义分配器(实际上,它没有默认分配器!)。你可以看看

EASTL http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html github

【讨论】:

在第二次阅读这个问题时,我想只有 EASTL 参考是你要找的。最初我以为您希望外部链接代码使用您的自定义分配器。这让我想到'挂钩 malloc/free' :)【参考方案2】:

要更改默认的 new 运算符,只需实现此函数(在全局范围内):

void* operator new (std::size_t size) throw (std::bad_alloc);

您可以在此处找到更多信息:http://www.cplusplus.com/reference/new/operator%20new/

我不完全确定它是否适用于动态库。

【讨论】:

以上是关于如何强制库使用自定义 std::allocator?的主要内容,如果未能解决你的问题,请参考以下文章

g++ 编译错误:std::ctype<char>、std::__detail、std::allocator<Taquart

令人信服的自定义C ++分配器示例?

[C++][原创]std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)’未定义的引用

STL容器自定义内存分配器

STL容器自定义内存分配器

STL容器自定义内存分配器