这是另一个问题的后续问题。
我认为下面的代码不应该使用monotonic_buffer_resource
,但是在生成的程序集中有对它的引用。
void default_pmr_alloc(std::pmr::polymorphic_allocator<int>& alloc) {
(void)alloc.allocate(1);
}
godbolt
我查看了头文件和libstdc++的源代码,但是没有发现默认的pmr分配器是如何选择monotonic_buffer_resource的。
1条答案
按热度按时间5n0oy7gb1#
大会讲述了这个故事,特别是:
这似乎是一个测试,以查看内存资源是否为
monotonic_buffer_resource
。这似乎是通过检查vtable的do_allocate
成员来完成的。如果它 * 不是 * 这样的资源(即:如果存储器资源中的do_allocate
不是单调的),则它向下跳转到:这似乎是一个vtable调用。
程序集的其余部分似乎是
monotonic_buffer_resource::do_allocate
的内联版本,这就是它有条件地调用std::pmr::monotonic_buffer_resource::_M_new_buffer
的原因。因此,总的来说,
polymorphic_resource::allocate
的这个实现似乎有一些monotonic_buffer_resource::do_allocate
的内置内联,如果资源适合的话。也就是说,如果它可以确定它应该调用monotonic_buffer_resource::do_allocate
,它就不会执行vtable调用。