我找不到这个问题的确切答案,因此在这里发帖。
当我想到向量时,它需要在连续的内存位置构建对象。这意味着向量保持分配的内存,并且必须对推入其中的对象进行就地构造(=放置新的)。这是一个有效的假设吗?另外,这是否意味着容器正在手动调用析构函数而不是调用删除?我在这里还缺少其他假设吗?这是否意味着我可以假设,如果我选择编写,即使是为该对象编写的自定义新内容也可能不会被调用?
列表使用 new 和 delete 也是有意义的,因为我们不需要连续内存保证。那么,这种行为是驱动分配器行为的原因吗?请帮忙。
谢谢
这意味着向量保持分配的内存,并且必须对推入其中的对象进行就地构造(=放置新的)。这是一个有效的假设吗?
Yes
另外,这是否意味着容器正在手动调用析构函数而不是调用删除?
Yes
我在这里还缺少其他假设吗?这是否意味着我可以假设,如果我选择编写,即使是为该对象编写的自定义新内容也可能不会被调用?
是的。请考虑,即使在链接列表中,容器也不会分配类型的实例,而是分配包含该类型的子对象的模板化结构。对于链表,它将是某种复杂类型,包含至少两个指针(两个链接)和您类型的子对象。实际分配的类型是node,不是你的类型。
列表使用 new 和 delete 也是有意义的,因为我们不需要连续内存保证。
确实如此,但又没有new
/delete
您类型的对象。
那么,这种行为是驱动分配器行为的原因吗?
我不太明白问题的这一部分。分配器是具有标准中定义的一组约束的类,其中包括接口(allocate
, deallocate
...)和语义(的含义==
是分配给一个的内存可以与另一个一起释放,类中的任何其他状态都是不相关的)。
可以出于不同的原因创建分配器并将其传递到容器上,包括效率(如果您只分配一种类型的对象,那么您可能能够实现比小块分配器稍微更高效的分配器malloc
——或者不,取决于情况)。
关于新位置的旁注
我一直觉得有趣的是安置新这个术语似乎有两个不同的含义。一方面是构造对象的唯一方式in-place。但它似乎也有完全不同的含义:构造此对象从自定义分配器获取内存.
事实上,它有一个单一的含义安置新这与构建无关in-place。第一种只是第二种情况,其中分配器由 18.4.1.3 中定义的实现(编译器)提供,并且不能重载。重载分配器的特定版本除了返回参数之外什么也不做(void*
) 所以这样新表达可以将其传递给构造函数并在由(未)分配的内存上构造对象安置新被称为的版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)