gpt4 book ai didi

c++ - 默认插入 vector 不是默认初始化吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:49 28 4
gpt4 key购买 nike

其中一个 std::vector 构造函数被规定为,强调我的:

explicit vector(size_type n, const Allocator& = Allocator());
Effects: Constructs a vector with n default-inserted elements using the specified allocator.
Requires: T shall be DefaultInsertable into *this.
Complexity: Linear in n.

默认插入与默认初始化有任何关系吗?在这段代码上:

std::vector<char> v(66000);

gcc 5.2 优化产生:

  400d18:   bf d0 01 01 00          mov    $0x101d0,%edi
400d1d: 48 83 c5 01 add $0x1,%rbp
400d21: e8 1a fd ff ff callq 400a40 <operator new(unsigned long)@plt>
400d26: 31 f6 xor %esi,%esi
400d28: 48 89 c3 mov %rax,%rbx
400d2b: ba d0 01 01 00 mov $0x101d0,%edx
400d30: 48 89 c7 mov %rax,%rdi
400d33: e8 38 fc ff ff callq 400970 <memset@plt>

内存设置在这里做什么?我认为这应该简单地执行与 new char[66000] 相同的操作...也就是说,没有初始化。 clang 3.7 还发出一个 memset

这里为什么会有memset?这相对于标准是否正确?毕竟,如果我想要 66000 个值初始化的字符,我已经有了这个构造函数:

std::vector<char> v(66000, '\0');

最佳答案

这是正确的行为。见 23.2.1:

An element of X is default-inserted if it is initialized by evaluation of the expression allocator_traits<A>::construct(m, p)

allocator_traits<A>::construct会调用a.construct(p, std::forward<Args>(args)...) .依次调用 ::new((void *)p) U(std::forward<Args>(args)...) ,实际上调用了 new() ,它进行值初始化。

结论:

memset()是合适的。

结论#2

缺少自定义分配器,std::vector不允许一个选项访问未初始化的存储。 vector 中合法的每个对象都被值初始化。

关于c++ - 默认插入 vector 不是默认初始化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35901417/

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