C 11 和 Boost.Container 中的向量行为:处理未初始化的元素
在 C 应用程序中,向量通常用作临时缓冲区。为了确保足够的容量,这些向量通常会进行大小调整操作。在 C 03 中,std::vector::resize() 函数通过附加指定值的副本来扩展向量。虽然此方法会初始化未使用的元素,但当仅考虑向量大小时,效率可能会很低。
C 11 引入了 resize() 的两个重载:
- resize(size_type n):执行值未使用元素的初始化。
- resize(size_type n, const value_type & val):用副本初始化未使用的元素
Boost.Container 通过额外的重载进一步扩展了此功能:
- resize(size_type n, default_init_t):对未使用的元素执行默认初始化。
为了验证这些函数的行为,使用 C 11 进行了测试std::vector和 boost::container::vector:
- 用值 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 填充向量。
- 删除了一些元素以创建具有所需大小的向量 [0, 1, 2, 3, 4].
- 使用不同的 resize() 重载将向量大小调整为 10 个元素。
- 打印更新后的向量。
预期行为
对于 C 03 std::vector,未使用的元素应该用零初始化。 boost::container 变体预计在 C 03 模式下编译时模拟 C 03 行为,并在 C 11 模式下编译时表现出不同的行为。
实际结果
令人惊讶的是,测试结果显示 std::vector和 boost::container::vector表现出相同的行为。在所有情况下,无论使用了 resize() 重载,未使用的元素都初始化为零。
解释
这种意外行为表明 resize() 接口C 11 中引入的更改在给定场景中没有实际效果。 C 03 std::vector::resize() 函数默认初始化未使用的元素。在 C 11 中,resize() 重载为显式初始化提供了附加选项,但它们不会改变默认初始化未使用元素的默认行为。 Boost.Container 实现中也反映了相同的行为。
含义
如果需要避免用零初始化未使用的元素,可以使用自定义分配器来拦截 std::allocator 的 construct() 方法并用默认初始化替换值初始化。但是,请谨慎行事,因为将其应用于所有初始化可能会导致意想不到的后果。
以上是C 11 的 `std::vector::resize()` 和 Boost.Container 的 `resize()` 如何处理未初始化的元素?的详细内容。更多信息请关注PHP中文网其他相关文章!