gcc가 std :: vector <> 복사를 위해 memcpy 대신 memmove를 생성하는 이유는 무엇입니까?

Praxeolitic

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);
}

godbolt의 예 .

키스 톰슨

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

std :: vector 대신 new 연산자를 사용하는 이유는 무엇입니까?

분류에서Dev

std :: vector가 다른 범위를 떠나면서 소멸자를 호출하는 이유는 무엇입니까?

분류에서Dev

std :: jthread 대신 std :: thread를 사용하는 이유는 무엇입니까?

분류에서Dev

gcc와 clang이 std :: find에 대해 그렇게 많은 코드를 생성하는 이유는 무엇입니까?

분류에서Dev

"= default"대신 기본 생성자 "{}"를 사용하는 성능 차이가있는 이유는 무엇입니까?

분류에서Dev

std :: vector 생성자가 이니셜 라이저 목록을 복사로받는 이유는 무엇입니까?

분류에서Dev

특히 std :: vector & 대신 std :: span을 함수에 전달해야하는 이유는 무엇입니까?

분류에서Dev

std :: vector의 생성자가 사용자 정의 클래스의 소멸자를 호출하는 이유는 무엇입니까?

분류에서Dev

std :: vector를 반환하는 것이 여전히 복사본을 만드는 이유는 무엇입니까?

분류에서Dev

GCC가 푸시 인 함수 호출 대신 Mov를 사용하는 이유는 무엇입니까?

분류에서Dev

함수 범위 대신 블록 범위를 사용해야하는 이유는 무엇입니까?

분류에서Dev

GCC가 int 나누기에 대해 올바른 어셈블리 코드를 생성하지 않는 이유는 무엇입니까?

분류에서Dev

return (pval)이 std를 제공하는 이유는 무엇입니까? p 값 대신 결과로 오류가 발생합니까?

분류에서Dev

Plan 9가 "복사"대신 "snarf"를 사용하는 이유는 무엇입니까?

분류에서Dev

내 HTML 생성자 객체가 [HTMLElementElement] 대신 [object Object]를 반환하는 이유는 무엇입니까?

분류에서Dev

autowired와 리소스가 맵에 대해 다른 키를 생성하는 이유는 무엇입니까?

분류에서Dev

CriteriaBuilder가 CollectionTable의 "in"에 대해 잘못된 쿼리를 생성하는 이유는 무엇입니까?

분류에서Dev

벡터에서 둘 이상의 값을 제거하기 위해 std :: remove ()를 사용할 때 건너 뛰기가 발생하는 이유는 무엇입니까?

분류에서Dev

gcc가 jmp 명령 대신 "leal -8240 (% ebp), % eax; cmpl $ 1, % eax; ja XXX"를 생성하는 이유는 무엇입니까?

분류에서Dev

VirtualBox 대신 Vagrant를 사용해야하는 이유는 무엇입니까?

분류에서Dev

Spotlight 대신 Quicksilver를 사용해야하는 이유는 무엇입니까?

분류에서Dev

Ubuntu가 glibc 대신 eglibc를 사용하는 이유는 무엇입니까?

분류에서Dev

Ubuntu가 glibc 대신 eglibc를 사용하는 이유는 무엇입니까?

분류에서Dev

Canonical은 Unity의 차세대를 위해 GTK 대신 QT를 선택하는 이유는 무엇입니까?

분류에서Dev

OS가 최대 절전 모드를 위해 모든 RAM을 HDD에 복사해야하는 이유는 무엇입니까?

분류에서Dev

OS가 최대 절전 모드를 위해 모든 RAM을 HDD에 복사해야하는 이유는 무엇입니까?

분류에서Dev

RabbitMQ가 STOMP 대신 HTTP를 통해 AMQP를 지원하지 않는 이유는 무엇입니까?

분류에서Dev

const std :: vector가 포함 된 객체에 const를 적용하는 이유는 무엇입니까?

분류에서Dev

std :: accumulate 함수가 잘못된 vector <double> 합계를 표시하는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    std :: vector 대신 new 연산자를 사용하는 이유는 무엇입니까?

  2. 2

    std :: vector가 다른 범위를 떠나면서 소멸자를 호출하는 이유는 무엇입니까?

  3. 3

    std :: jthread 대신 std :: thread를 사용하는 이유는 무엇입니까?

  4. 4

    gcc와 clang이 std :: find에 대해 그렇게 많은 코드를 생성하는 이유는 무엇입니까?

  5. 5

    "= default"대신 기본 생성자 "{}"를 사용하는 성능 차이가있는 이유는 무엇입니까?

  6. 6

    std :: vector 생성자가 이니셜 라이저 목록을 복사로받는 이유는 무엇입니까?

  7. 7

    특히 std :: vector & 대신 std :: span을 함수에 전달해야하는 이유는 무엇입니까?

  8. 8

    std :: vector의 생성자가 사용자 정의 클래스의 소멸자를 호출하는 이유는 무엇입니까?

  9. 9

    std :: vector를 반환하는 것이 여전히 복사본을 만드는 이유는 무엇입니까?

  10. 10

    GCC가 푸시 인 함수 호출 대신 Mov를 사용하는 이유는 무엇입니까?

  11. 11

    함수 범위 대신 블록 범위를 사용해야하는 이유는 무엇입니까?

  12. 12

    GCC가 int 나누기에 대해 올바른 어셈블리 코드를 생성하지 않는 이유는 무엇입니까?

  13. 13

    return (pval)이 std를 제공하는 이유는 무엇입니까? p 값 대신 결과로 오류가 발생합니까?

  14. 14

    Plan 9가 "복사"대신 "snarf"를 사용하는 이유는 무엇입니까?

  15. 15

    내 HTML 생성자 객체가 [HTMLElementElement] 대신 [object Object]를 반환하는 이유는 무엇입니까?

  16. 16

    autowired와 리소스가 맵에 대해 다른 키를 생성하는 이유는 무엇입니까?

  17. 17

    CriteriaBuilder가 CollectionTable의 "in"에 대해 잘못된 쿼리를 생성하는 이유는 무엇입니까?

  18. 18

    벡터에서 둘 이상의 값을 제거하기 위해 std :: remove ()를 사용할 때 건너 뛰기가 발생하는 이유는 무엇입니까?

  19. 19

    gcc가 jmp 명령 대신 "leal -8240 (% ebp), % eax; cmpl $ 1, % eax; ja XXX"를 생성하는 이유는 무엇입니까?

  20. 20

    VirtualBox 대신 Vagrant를 사용해야하는 이유는 무엇입니까?

  21. 21

    Spotlight 대신 Quicksilver를 사용해야하는 이유는 무엇입니까?

  22. 22

    Ubuntu가 glibc 대신 eglibc를 사용하는 이유는 무엇입니까?

  23. 23

    Ubuntu가 glibc 대신 eglibc를 사용하는 이유는 무엇입니까?

  24. 24

    Canonical은 Unity의 차세대를 위해 GTK 대신 QT를 선택하는 이유는 무엇입니까?

  25. 25

    OS가 최대 절전 모드를 위해 모든 RAM을 HDD에 복사해야하는 이유는 무엇입니까?

  26. 26

    OS가 최대 절전 모드를 위해 모든 RAM을 HDD에 복사해야하는 이유는 무엇입니까?

  27. 27

    RabbitMQ가 STOMP 대신 HTTP를 통해 AMQP를 지원하지 않는 이유는 무엇입니까?

  28. 28

    const std :: vector가 포함 된 객체에 const를 적용하는 이유는 무엇입니까?

  29. 29

    std :: accumulate 함수가 잘못된 vector <double> 합계를 표시하는 이유는 무엇입니까?

뜨겁다태그

보관