Kir*_*ran 5 c++ containers stl vector placement-new
我无法找到这个问题的确切答案,因此在此发布.当我想到vector时,它需要在连续的内存位置构建对象.这意味着向量保持内存分配,并且必须对被推入其中的对象进行就地构造(= placement new).这是一个有效的假设吗?此外,这是否意味着容器手动调用析构函数而不是调用delete?我在这里缺少任何其他假设吗?这是否意味着我可以假设,如果我选择写,即使是为对象编写的自定义新内容也可能无法调用?
此外,列表使用new和delete也是有意义的,因为我们不需要连续的内存保证.那么,这种行为是驱动分配器行为的原因吗?请帮忙.谢谢
这意味着向量保持分配的内存,并且必须对推入其中的对象进行就地构造(=放置新的)。这是一个有效的假设吗?
是的
另外,这是否意味着容器正在手动调用析构函数而不是调用删除?
是的
我在这里还缺少其他假设吗?这是否意味着我可以假设,如果我选择编写,即使是为该对象编写的自定义新内容也可能不会被调用?
是的。请考虑,即使在链接列表中,容器也不会分配类型的实例,而是分配包含该类型的子对象的模板化结构。对于链表,它将是某种复杂类型,包含至少两个指针(两个链接)和您类型的子对象。分配的实际类型是该节点,而不是您的类型。
列表使用 new 和 delete 也是有意义的,因为我们不需要连续内存保证。
它确实如此,但它不new
/delete
您类型的对象。
那么,这种行为是驱动分配器行为的原因吗?
我不太明白问题的这一部分。分配器是在标准中定义了一组约束的类,这些约束包括接口 ( , allocate
... deallocate
) 和语义(其含义==
是用一个分配的内存可以用另一个分配,类中的任何其他状态是无关紧要的)。
可以出于不同的原因创建分配器并将其传递到容器上,包括效率(如果您只分配一种类型的对象,那么您可能能够实现稍微比效率更高的小块分配器,或者malloc
不是,取决于具体情况)。
关于新位置的旁注
我一直发现有趣的是,“放置新”这个术语似乎有两个不同的含义。一方面是就地构造对象的唯一方法。但它似乎也有一个完全不同的含义:构造这个对象,从自定义分配器获取内存。
事实上,placement new只有一个含义,与就地构建无关。第一种情况只是第二种情况,其中分配器由 18.4.1.3 中定义的实现(编译器)提供,并且不能重载。重载分配器的特定版本除了返回参数 ( void*
) 之外什么也不做,以便new 表达式可以将其传递到构造函数中,并在由调用的放置新版本分配的内存(而不是)上构造对象。
归档时间: |
|
查看次数: |
2976 次 |
最近记录: |