Вставка по умолчанию в вектор не является инициализацией по умолчанию?
Один изstd::vector
Конструкторы оговариваются как, акцент мой:
explicit vector(size_type n, const Allocator& = Allocator());
Последствия: Создаетvector
сn
по умолчанию вставленными элементы, использующие указанный распределитель.
Требуется: 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, '\0');