c++ 如何在容器中存储(空)分配器而不占用大小?

jhkqcmku  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(104)

我有一个分配器感知容器,如果它是一个有状态的分配器,它必须存储分配器(例如:多态分配器)。否则,分配器不应占用任何空间。我以为stdlib会使用类似于空基优化的东西来实现这一点,然而,我似乎无法让它工作:
演示

#include <cstdio>
#include <memory>
#include <memory_resource>
#include <iostream>

template <typename T, typename Allocator>
struct MyContainerBase {
    Allocator allocator;
};

template <typename T, typename Allocator = std::allocator<T>>
struct MyContainer : private MyContainerBase<T, Allocator>
{
    using base_ = MyContainerBase<T, Allocator>;

    T myint_;
};

int main() {
    MyContainer<int> c;

    std::cout << "size = " << sizeof(MyContainer<int>) << std::endl;
}

产量

size = 8

我查看了vector的libc和libstdc实现,但根本找不到存储的分配器?不过它仍然可以与pmr分配器一起工作。我该怎么做?另外,我必须至少有一些分配器对象引用,以便与std::allocator_traits<Allocator>(myalloc);一起使用

nxagd54h

nxagd54h1#

在C20之前,这需要使用空基优化,但在C20中,解决方案非常简单:使用no_unique_address attribute

template <typename T, typename Allocator>
struct MyContainerBase {
#ifdef _MSC_VER
    [[msvc::no_unique_address]]
#else
    [[no_unique_address]]
#endif
    Allocator allocator;
};

联机编译程序

相关问题