内存池的初始块大小 我用C++模板实现内存池类,我想知道块的大小是多少。例如: template <typename T> class Mempool { unsigned char* block; // constructor. Mempool() { block = malloc(sizeof(T)*DEFAULT_N) } }; 模板 类内存池{ 无符号字符*块; //构造器。 Mempool(){ block=malloc(sizeof(T)*默认值) } };

内存池的初始块大小 我用C++模板实现内存池类,我想知道块的大小是多少。例如: template <typename T> class Mempool { unsigned char* block; // constructor. Mempool() { block = malloc(sizeof(T)*DEFAULT_N) } }; 模板 类内存池{ 无符号字符*块; //构造器。 Mempool(){ block=malloc(sizeof(T)*默认值) } };,c++,memory-pool,C++,Memory Pool,在上面的示例中,块大小实际上取决于类型T和要创建的元素数量的默认值。这样做的最佳(或常见)做法是什么?这里是否应该考虑块大小的内存对齐? ,我只能给出一些一般的建议,因为很大程度上取决于实际用例: 对齐: 我想池应该确保池中的对象正确对齐。这意味着您可能希望将对象放置在至少是std::alignment\u of::value或alignof(T)倍数的内存位置 缓存友好性:池还可以将对象位置取整为缓存线大小的倍数,因此(小)对象永远不会跨两条缓存线放置,而是始终位于一条缓存线中 填充:如果对象

在上面的示例中,块大小实际上取决于类型
T
和要创建的元素数量的默认值。这样做的最佳(或常见)做法是什么?这里是否应该考虑块大小的内存对齐?

,我只能给出一些一般的建议,因为很大程度上取决于实际用例:

对齐: 我想池应该确保池中的对象正确对齐。这意味着您可能希望将对象放置在至少是
std::alignment\u of::value
alignof(T)
倍数的内存位置

缓存友好性:池还可以将对象位置取整为缓存线大小的倍数,因此(小)对象永远不会跨两条缓存线放置,而是始终位于一条缓存线中

填充:如果对象非常小(只有几个字节),但有很多,那么任何额外的填充都可能会大大增加内存需求,这取决于应用程序是否会出现问题。当对象不在紧密的位置且存在大量缓存未命中时,过多的填充实际上可能会影响性能

底层内存管理:最后,好的块大小也可能取决于底层存储。您可能希望您的分配大小与操作系统页面大小相匹配,或者使用它们的倍数。此外,如果
malloc
的开销很大,那么您可能希望尽可能少地调用它,以避免系统调用开销和争用。在
malloc
更便宜的环境中,可以使用较小的初始块大小和更频繁地使用
malloc
,尽管
malloc
仍会有一些开销。其中很大一部分是特定于操作系统的

因此,无论您选择什么初始大小,都应该测量一些典型工作负载的内存使用和分配性能。这将允许你做出比单纯猜测更具教育意义的估计


最后,还有随时可用的malloc替换,例如tcmalloc、jemalloc,它们可能具有与操作系统的
malloc
完全不同的特性。因此,一个好的选择是检查其中一个,而不是滚动您自己的分配器。

因此,您将实现您自己的分配器。除非您只是为了练习的乐趣而这样做,否则您可能认为您对应用程序的特定分配特性有一些了解,这使您能够比标准库的分配器做得更好。然而,我们没有这方面的知识,因为你的问题中没有这方面的知识,所以我认为不能给出一个有用的一般性答案。换句话说:你的问题非常广泛。正如@5gon12eder所暗示的,这个问题的答案会有很大的不同,这取决于
sizeof T==1
还是
sizeof T==12345
…T的大小实际上取决于用户定义的类,并且随用户定义的类而变化。我想我需要的是一个启发,可以给一个很好的打击性能。谢谢STJ!这正是我需要的。