gpt4 book ai didi

C++ STL : Why allocators don't increase memory footprint of containers?

转载 作者:行者123 更新时间:2023-12-04 16:24:11 25 4
gpt4 key购买 nike

以下代码片段 (see on godbolt) 表明大分配器不会增加 STL 容器的内存占用,但大比较器会。为什么会这样?

// compiled with x86-64 gcc 10.3, -std=c++17
#include <functional>
#include <iostream>
#include <memory>
#include <set>

struct MyLess : public std::less<int>
{
char dummy[1024];
};

struct MyAllocator : public std::allocator<int>
{
char dummy[1024];
};

int main()
{
std::cout << sizeof(std::set<int, MyLess>) << std::endl; // prints 1064
std::cout << sizeof(std::set<int, std::less<int>, MyAllocator>) << std::endl; // prints 48
return 0;
}

最佳答案

你的分配器没有被使用。

默认情况下,std::set接收 std::allocator<int> ,但它需要分配某种节点,而不是int s。它使用 std::allocator_traits::rebind 为其内部节点类型获取不同的分配器。

C++20 之前的 std::allocator 有一个 rebind成员类型,您继承的,std::allocator_traits::rebind发现。那rebind指向 std::allocator ,这就是你得到的。

从 C++20 开始,没有 rebindstd::allocator , 所以 std::allocator_traits::rebind回退到直接修改分配器的第一个模板参数,由于它不是模板,所以会出现编译错误。

一个可能的解决方案是让你的分配器成为一个模板,并提供你自己的rebind (可能格式错误,模板参数会自动替换):

template <typename T>
struct MyAllocator : public std::allocator<T>
{
char dummy[1024];
struct rebind {}; // Malformed `rebind` to hide the inherited one, if any.
};

然后 1072是为我打印的。

关于C++ STL : Why allocators don't increase memory footprint of containers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68591617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com