문제

나는 데이터를 새로 획득 한 char 어레이에 저장하는 간단한 바이트 버퍼를 만들고 있으며, Memcpy 및 Memmove 기능이 새로운 방법으로 획득 한 메모리에 사용되거나 대신 추천 할 것이라면 이상한 것을 줄 것인지 궁금했습니다. ?

도움이 되었습니까?

해결책

아니요, 그들은 완벽하게 괜찮습니다. new 그리고 malloc() 당신은 힙에 메모리를 키울 수있는 두 가지 방법입니다 (실제로는 매우 동일합니다. new 용도 malloc() 대부분의 구현에서 후드 아래). 유효한 사람이있는 즉시 char* 손에 변수 (할당 된 new, malloc() 또는 스택에서) 메모리에 대한 포인터 일뿐입니다. memcpy() 이 가족의 다른 기능은 예상대로 작동합니다.

다른 팁

사용 memcpy()/memmove() 그런 종류의 데이터에서 잘 작동해야합니다. 일반적으로 모든 포드 유형에서 안전하게 사용할 수 있습니다.

Char Array 데이터의 경우 새로운 것과 관련하여 잘 작동해야합니다.

그러나 C ++에서 왜 std :: copy 또는 std :: copy_backward를 사용하고 질문을 완전히 제거하지 않습니까?

실제로는 플랫폼과 컴파일러의 구현에 따라 new 그리고 memmove. 대부분의 프로세서 아키텍처는 워드 경계에 정렬 될 때 데이터를 더 잘 뒤집었지만 일부는 더 잘 수행되는 추가 사례가 있습니다. 예를 들어 PowerPC 7447은 메모리가 정렬 된 상태에서 가장 빠르게 작동합니다. 16 바이트 경계. 이는 Altivec Simd 명령 세트에 대한 벡터 레지스터의 크기이므로 16 바이트 경계에 할당 된 배열에서 Memcpy 또는 유사한 함수가 훨씬 빠르게 구현 될 수 있습니다. 보다 이 질문 예를 들어.

이것이 왜 새로운 것을 변화 시키는가? 새 연산자는 반환하는 포인터 이전의 몇 바이트에 할당 된 메모리 블록에 대한 메타 데이터를 저장할 수 있으므로 실제 포인터는 할당의 실제 시작을 지나는 단어 또는 두 단어입니다. CPU, OS 및 컴파일러 에서이 동작 (PowerPC 7447A, VXWorks 5.5, GCC 2.95)을 만난 CPU에서 새 연산자는 8 바이트가 정렬되었지만 16 바이트 정렬되지 않은 블록을 제공하도록 보장되었습니다. 물론 이것은 매우 구현에 따라 다릅니다. C ++ 표준에 조정을 지정하는 것이 아키텍처 별 최적화가 될 것이기 때문에 어떤 것이 있다고 생각하지 않습니다.

이 모든 것의 요점은 특정 플랫폼에 있고 정렬과 같은 낮은 레벨 최적화 문제에 관심이있는 경우 약간의 성능 차이를 만들 수 있다는 것입니다. 대부분의 응용 프로그램에 대해 이것에 대해 걱정할 필요가 없습니다.

나는 여전히 std :: copy와 함께 벡터를 사용하지만 새로운/memcpy/memmove가 나쁘다는 의미는 아닙니다. 버퍼 내에서 움직이는 부분을 고집하면 Memmove가 실제로 선호됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top