为什么 std::分配器是一个模板?
Why is std::allocator a template?
分配器的工作是通过其allocate
方法获取"原始"内存。调用方在分配器返回的内存中构造的内容与分配器无关(对吗?那么,为什么std::allocator
是一个模板,而这似乎只会增加不必要的复杂性呢?分配器实际上如何处理该类型信息?为什么它必须知道内存的对象类型?我假设我错过了一些明显的原因,那么这个原因是什么?
嗯,std::allocator
和分配器概念本身是为了处理诸如近指针和远指针之类的问题而发明的,或者通常指向不同地址空间的指针。他们处理那个...充分。分配器确定使用的指针类型。
它们也可以用来处理不同的内存分配器,尽管这方面的样板数量有些惊人。
最后,分配器感知容器可以与分配器结合使用,利用它为子元素提供子分配器,这可能有助于减少开销。
第一点现在大多已经过时了,尽管它可以与第二点一起使用,以便在共享内存段或文件中具有映射地址不变容器。
第二点可用于利用专门的分配器,尽管界面对此并不好。一个例子,我用它来破解我一个安全std::basic_string
。
最后一点很少使用。
所定义的分配器概念的一个巨大缺点是它使用模板。所有使用都已经过std::allocator_traits<Allocator>
,所以如果没有分配器的模板参数,它只会导致类型无意中几乎相同。
并且还对大量重复的代码进行适当的重新绑定分配器。
对齐浮现在脑海中。不同的类型有不同的对齐要求,适合char
数组的内存位置可能不适合double
(通常需要 8 字节对齐地址(。
OTOH,应该注意的是,malloc
通过为最严格的内置类型提供正确对齐的内存来解决此问题,这对于通用分配器来说通常是一个足够好的解决方案。
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 将 std::array 移动到另一个 std::array
- 为什么 Clang std::ostream 写一个 std::istream 无法读取的双精度?
- 访问 std:vector 的类成员 std:vector 在一个类中与另一个 std:vector
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- 在线程 A 中创建一个 std::thread 对象,在线程 B 中连接
- 使用 glDrawElements 绘制一个 std::vector
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- 我可以得到一个字符 * 到一个 std::sregex_iterator 匹配 str() 吗?
- 如何有效地将(一些)项目从一个std::map移动到另一个std::map
- 我可以制作一个std::set的constexpr对象吗
- 打印一个带有静态 int 的函数,有一个 std::cout 和多个 std::cout 有什么区别?
- Visual Studio 2017 STL 可视化工具失败了一个 std::map<MyIntrusivePtr, std::tuple<....> >
- 如何设置一个 std::vector 与另一个,其中两个是不同类的向量?
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 如何构造一个 std::variant 类型对象,其自身 Templated 和构造函数转发参数
- 如何声明一个 std::用不同值内联初始化的结构数组
- 将对象从一个 std::d eque 移动到另一个的更好方法