默认插入向量不是默认初始化吗?
Default-inserting into a vector isn't default initialization?
>std::vector
构造函数之一被规定为,强调我的:
默认
explicit vector(size_type n, const Allocator& = Allocator());
影响:使用指定的分配器构造包含n
默认插入元素的vector
。
需要:T
应DefaultInsertable
*this.
复杂性:线性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>
memset
?你在这里做什么?我认为这应该只是相当于new char[66000]
......也就是说,没有初始化。Clang 3.7 也发出memset
.
为什么这里有memset
?就标准而言,这是否正确?毕竟,如果我想要 66000 个值初始化字符,我已经有了这个构造函数:
std::vector<char> v(66000, ' ');
这是
正确的行为。参见 23.2.1:
如果 X 的元素是通过计算表达式初始化的,则默认插入该元素
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
不允许人们选择访问未初始化的存储。每个合法地在向量中的对象都被值初始化了。
相关文章:
- 使用 std::分配器在 constexpr 中进行默认初始化
- 为什么对象默认初始化,但基元不在C++?
- 为什么std::atomic的默认构造函数不默认初始化底层存储值
- 两个成员,在Base中默认初始化,可能在Derived中非默认初始化
- 默认初始化无法正常工作
- C++11默认初始化/值初始化/直接初始化
- make_shared是否对每个成员变量执行默认初始化(零初始化)
- 是否可以默认初始化具有已删除默认构造函数的类类型
- 对象成员数组C++默认初始化
- POD成员默认初始化无括号
- 如何在不使用 new 的情况下进行默认初始化
- 有没有办法欺骗 std::make_shared 使用默认初始化
- 枚举类默认初始化
- 是默认的构造函数和默认初始化
- 为什么在C 中不允许使用括号的默认初始化
- 默认初始化的含义在C 11中发生了变化
- Main()函数中的默认初始化
- WINHTTP_CURRENT_USER_IE_PROXY_CONFIG默认初始化
- 强制本地变量默认初始化
- 默认初始化混乱