gpt4 book ai didi

c++ - sizeof(std::list) 可以因不同类型的 T 而有所不同吗?

转载 作者:IT老高 更新时间:2023-10-28 22:14:38 24 4
gpt4 key购买 nike

我可以假设对于任何类型T , 类型 std::list<T>将有相同的,恒定的大小?为了清楚起见,我的意思是“主”类型本身的大小,而不是它分配的内存。

在我看来,假设 T 的大小是合乎逻辑的。本身应该只影响使用分配器分配的列表节点的大小。

但是,有两件事可能会导致 sizeof(std::list<T>) 的变化。我能想到:

  1. 试图“优化”std::list 的标准 C++ 库输入一些 T std::list<T> 中的实例本身。这对我来说似乎是个坏主意,它可能违反了标准提出的“恒定时间”要求;
  2. 标准 C++ 库特化为 std::list<T>对于某些类型,特化具有不同的大小。

我想不出 (1) 或 (2) 的任何用途,但我可能错了。

我想要实现的是使用 std::list<T> 为模板类使用固定大小的切片分配器。里面。


注意:这是关于不同类型 T 的差异。 , 而 not 用于不同的分配器。我将明确控制所有实例化,它们都将使用 std::allocator .

最佳答案

是的,可以。

该标准对 list<T> 的大小没有任何精确的保证。据我所知,反对。不过,还有其他保证。


让我们揭穿一些事情:

A standard C++ library trying to 'optimize' the std::list type by putting some of T instances into the std::list<T> itself. That seems like a bad idea to me, and it probably breaks the 'constant time' requirements put by the standard;

只要这个数字是有界的,它就不会以任何方式打破“恒定时间”的要求,因为 O(5) 是 O(1)。然而,在 splice操作时,节点应该从一个列表移动到另一个列表而不在内存中移动。因此禁止本地存储。

A standard C++ having library specializations of std::list<T> for some types, with the specializations having different sizes.

由于我们已经排除了本地存储的可能性,因此很难想象基础 std::list<T> 的任何其他变体。 单独输入


让我们担心什么是重要的:

std::list<T> 分配的内存由它的第二个模板参数提供:分配器。大多数分配器(包括默认的 std::allocator<T>)使用简单的指针类型:T* ...但是分配器应该可以随意更改这种类型。

因此,通过更改 allocator参数(更准确地说,它的指针类型),自然会改变 std::list 的大小我见过的所有实现中的容器。

请注意,分配器本身可以专门用于某些类型,但是使用重新绑定(bind)魔法有点难以实现。

关于c++ - sizeof(std::list<T>) 可以因不同类型的 T 而有所不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11794464/

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