나는 내 인식이 실제로 사실인지 묻기 위해 여기에있다. 원래 vector<T> v(size_t someSize, T init_value)
을 정의하는 것이 vector<T>::push_back
대신 vector<T>::reserve
과 같은 함수를 호출한다고 생각했습니다. 이것에 관한 몇 가지 토론을 여기에서 보았습니다 : std::vector push_back is bottleneck, 그러나 이것은 약간 다른 아이디어입니다.벡터 <T> :: 미리 정의 된 생성자에 push_back이 사용됩니까?
일부 실험을 실행하면 vector<T> v(size_t someSize, T init_value)
이 모두 ::push_back
입니다. 사실입니까? uftrace
(https://github.com/namhyung/uftrace)을 사용하는 다음 보고서가 있습니다. vector<T>::reserve
도 결국 vector<t>::push_back
에
Avg total Min total Max total Function
========== ========== ========== ====================================
858.323 ms 858.323 ms 858.323 ms main
618.245 ms 618.245 ms 618.245 ms sortKaway
234.795 ms 234.795 ms 234.795 ms std::sort
72.752 us 72.752 us 72.752 us std::vector::_M_fill_initialize
65.788 us 49.551 us 82.026 us std::vector::vector
20.292 us 11.387 us 68.629 us std::vector::_M_emplace_back_aux
18.722 us 17.263 us 20.181 us std::equal
18.472 us 18.472 us 18.472 us std::vector::~vector
17.891 us 10.002 us 102.079 us std::vector::push_back // push_back?!
를 호출합니까? vector
에 대한 더 빠른 버전이 있습니까?
위의 글은 원래 게시물이었습니다. 몇 가지 코멘트를 한 후, 나는 간단한 버전을 테스트했고, 나는 완전히 착각되었다는 것을 깨달았다.
#include <vector>
#include <functional>
#include <queue>
#include <cassert>
using namespace std; // for the time being
int main() {
vector<int> v(10, 0);
return 0;
}
이 실제로 std::vector<T>::push_back
을 포함하지 않는 다음에 발생합니다.
# Function Call Graph for 'main' (session: 9ce7f6bb33885ff7)
=============== BACKTRACE ===============
backtrace #0: hit 1, time 12.710 us
[0] main (0x4009c6)
========== FUNCTION CALL GRAPH ==========
12.710 us : (1) main
0.591 us : +-(1) std::allocator::allocator
0.096 us : | (1) __gnu_cxx::new_allocator::new_allocator
: |
6.880 us : +-(1) std::vector::vector
4.338 us : | +-(1) std::_Vector_base::_Vector_base
0.680 us : | | +-(1) std::_Vector_base::_Vector_impl::_Vector_impl
0.445 us : | | | (1) std::allocator::allocator
0.095 us : | | | (1) __gnu_cxx::new_allocator::new_allocator
: | | |
3.294 us : | | +-(1) std::_Vector_base::_M_create_storage
3.073 us : | | (1) std::_Vector_base::_M_allocate
2.849 us : | | (1) std::allocator_traits::allocate
2.623 us : | | (1) __gnu_cxx::new_allocator::allocate
0.095 us : | | +-(1) __gnu_cxx::new_allocator::max_size
: | | |
1.867 us : | | +-(1) operator new
: | |
2.183 us : | +-(1) std::vector::_M_fill_initialize
0.095 us : | +-(1) std::_Vector_base::_M_get_Tp_allocator
: | |
1.660 us : | +-(1) std::__uninitialized_fill_n_a
1.441 us : | (1) std::uninitialized_fill_n
1.215 us : | (1) std::__uninitialized_fill_n::__uninit_fill_n
0.988 us : | (1) std::fill_n
0.445 us : | +-(1) std::__niter_base
0.096 us : | | (1) std::_Iter_base::_S_base
: | |
0.133 us : | +-(1) std::__fill_n_a
죄송합니다. 예, 라이브러리 구현은 예상대로 작동하지만 initial size
으로 생성 된 경우 push_back
은 포함되지 않습니다.
Elipses ("...")는 C++에서 특별한 의미를 갖습니다. 혼란을 야기 할 수 있으므로 질문 및 특히 코드 블록에서주의해서 사용하십시오. –
'reserve '의 일반적인 사용 예는 한 번 및'push_back'을 여러 번 예약하는 것입니다. 이 두 기능은 상호 배타적 인 것이 아니며 사실 함께 사용되는 경우가 많습니다. –
@ FrançoisAndrieux 당신이 맞다. 나는 더주의를 기울여야한다. – user7865286