gcc 为什么'monotonic_buffer_resource'出现在程序集中,而它似乎没有被使用?

zpf6vheq  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(162)

这是另一个问题的后续问题。
我认为下面的代码不应该使用monotonic_buffer_resource,但是在生成的程序集中有对它的引用。

void default_pmr_alloc(std::pmr::polymorphic_allocator<int>& alloc) {
    (void)alloc.allocate(1);
}

godbolt
我查看了头文件和libstdc++的源代码,但是没有发现默认的pmr分配器是如何选择monotonic_buffer_resource的。

5n0oy7gb

5n0oy7gb1#

大会讲述了这个故事,特别是:

cmp     rax, OFFSET FLAT:_ZNSt3pmr25monotonic_buffer_resource11do_allocateEmm
jne     .L11

这似乎是一个测试,以查看内存资源是否为monotonic_buffer_resource。这似乎是通过检查vtable的do_allocate成员来完成的。如果它 * 不是 * 这样的资源(即:如果存储器资源中的do_allocate不是单调的),则它向下跳转到:

.L11:
        mov     rdi, rbx
        mov     edx, 4
        mov     esi, 4
        pop     rbx
        jmp     rax

这似乎是一个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调用。

相关问题