gcc 5.3에서는 다음 예제의 두 함수가 memmove
. 생성하는 것이 부적절 memcpy
합니까?
#include <vector>
int blackhole(const std::vector<int>&);
int copy_vec1(const std::vector<int>& v1) {
const std::vector<int> v2{v1.begin(), v1.end()};
return blackhole(v2);
}
int copy_vec2(const std::vector<int>& v1) {
const auto v2 = v1;
return blackhole(v2);
}
g ++ 6.1.0을 사용하여이 코드를 컴파일 해 보았습니다. 세부 사항에 대해서는 전혀 확신 할 수 없지만 memmove
호출이 컴파일러에 의해 직접 생성되는 것은 아니라고 생각합니다 . 오히려 <vector>
.
다음을 사용하여 코드를 전처리 할 때
/o/apps/gcc-6.1.0/bin/g++ -E -std=c++14 c.cpp
에 대한 두 번의 호출이 __builtin_memmove
모두에서 오는 것을 .../include/c++/6.1.0/bits/stl_algobase.h
봅니다. 해당 헤더 파일을 보면 다음 주석이 표시됩니다.
// All of these auxiliary structs serve two purposes. (1) Replace
// calls to copy with memmove whenever possible. (Memmove, not memcpy,
// because the input and output ranges are permitted to overlap.)
// (2) If we're using random access iterators, then write the loop as
// a for loop with an explicit count.
나는 벡터를 복사하기 위해 호출 된 코드 가 겹칠 수있는 복사본 (예 : std::move
(?)에 대한 호출)에보다 일반적으로 적용 할 수 있다는 것 입니다.
(나는 그 확인되지 않은 memmove
받는 어셈블리 목록 대응에 표시 통화 __builtin_memmove
에 전화를 stl_algobase.h
. 나는 그 시점에 후속 다른 사람을 초대합니다.)
구현에 따라에 비해 약간의 오버 헤드 memmove()
가있을 수 있지만 그 차이는 미미합니다. 겹칠 수없는 복사본에 대해 특수한 경우 코드를 만들 가치가 없었을 것입니다.memcpy()
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다