새로운 배열을 사용하여 char 배열에 데이터를 저장하는 간단한 바이트 버퍼를 만들고 있습니다. memcpy 및 memmove 함수가 새로운 메모리로 사용되는 경우 이상한 것을 제공하는지 궁금합니다. 아니면 대신하는 것이 좋습니다 것이 있습니까?memmove, memcpy 및 new
답변
아니요, 괜찮습니다. new
과 malloc()
은 힙에 메모리를 확보 할 수있는 두 가지 다른 방법 일뿐입니다. 실제로 대부분의 구현에서 new
은 malloc()
을 사용하기 때문에 실제로 동일합니다. 손에 유효한 char*
변수 (new
, malloc()
또는 스택에 할당 됨)를 갖게되면 메모리에 대한 포인터가되므로 memcpy()
및이 패밀리의 다른 기능이 예상대로 작동합니다.
유효한'char *'변수가 있어야한다는 것에주의해야합니다. 'char * c = NULL;'또는'char * c = 0xfacefeed;'는 아마도'memcpy()'나'memmove()'와 잘 일치하지 않을 것이다. –
이 케이스를 명확히하기 위해 편집 됨. 감사! – pajton
memcpy()
/memmove()
을 사용하면 해당 종류의 데이터에서 올바르게 작동합니다. 일반적으로 모든 POD 유형에서 안전하게 사용할 수 있습니다.
POD-ness가 핵심입니다. –
char 배열 데이터의 경우 new와 함께 사용해도 정상적으로 작동해야합니다.
그러나 C++에서 std :: copy 또는 std :: copy_backward를 사용하지 말고 질문을 완전히 제거 하시겠습니까?
나는 여전히 std :: copy와 함께 vector를 사용할 것이지만, 새로운/memcpy/memmove가 좋지 않다는 것을 의미하지는 않는다. 버퍼 안에서 움직이는 부분을 고집한다면 memmove가 실제로 선호됩니다.
실제로 플랫폼에 따라 다르며 컴파일러의 구현은 new
과 memmove
입니다. 대부분의 프로세서 아키텍처는 워드 경계에서 정렬 될 때 데이터를보다 잘 섞습니다. 그러나 일부는 더 나은 성능을 발휘하는 추가 사례를 가지고 있습니다. 예를 들어, PowerPC 7447은 16 byte boundaries에 정렬 된 메모리로 가장 빠르게 작동합니다. 이는 Altivec SIMD 명령어 세트의 벡터 레지스터 크기이므로 memcpy 또는 유사한 함수를 구현하여 16 바이트 경계에 할당 된 배열에서 훨씬 빠르게 수행 할 수 있습니다. 예를 들어 this question을 참조하십시오.
이것이 새로운 이유는 무엇입니까? new 연산자는 반환 된 포인터 앞에 몇 바이트에 할당 된 메모리 블록에 대한 메타 데이터를 저장할 수 있으므로 실제 포인터는 단어의 두 번째 또는 두 번째 실제 할당 시작 지점입니다. CPU, OS 및 컴파일러에서이 동작 (PowerPC 7447a, VxWorks 5.5, GCC 2.95)이 발생하면 new 연산자는 8 바이트 정렬이지만 16 바이트 정렬되지 않은 블록을 제공한다는 보장을 받았습니다. 이것은 물론 구현과 관련이 있습니다. 나는 C++ 표준에서 정렬을 지정하는 어떤 것도 아키텍처 특정 최적화가 될 것이므로 믿지 않는다.
모든 점은 특정 플랫폼을 사용하고 정렬과 같은 낮은 수준의 최적화 문제에 관심이있는 경우 약간의 성능 차이가 발생할 수 있다는 것입니다. 대부분의 응용 프로그램에서는이 점에 대해 걱정할 필요가 없을 것입니다.
"새 연산자는 반환되는 포인터 앞에 몇 바이트에 할당 된 메모리 블록에 대한 메타 데이터를 저장할 수 있으므로 실제 포인터는 단어의 두 번째 또는 두 번째 실제 할당 시작 지점입니다."- 그렇다면 malloc()과 같습니다. –
예. 그냥 malloc처럼. 일부 플랫폼은 메모리의 정렬 경계를 지정할 수있는 대체 메모리 할당 기능을 제공합니다. 정말로 정렬에 관심이 있다면, 이러한 루틴 중 하나를 찾아야합니다. –
- 1. memcpy 복사 자체가 부분적으로 복사
- 2. memcpy 오버플로
- 3. startIndex가있는 memcpy?
- 4. Javascript, jQuery.extend 및 "new"
- 5. memcpy 및 realloc에 어떤 헤더를 포함해야합니까?
- 6. C memcpy in reverse
- 7. 연산자 new 및 new 연산자는 오버로드 할 수 없습니까?
- 8. Memcpy 유효한 포인터로 segfaulting
- 9. 안전한 방법으로 memcpy 바꾸기
- 10. memcpy/memset 사용
- 11. STL에서 memcpy 사용
- 12. 구조체 일부의 memcpy
- 13. 리눅스에서 비동기 memcpy?
- 14. memcpy params는 같은 유형이어야합니까?
- 15. memcpy() 함수가 재 입력입니까?
- 16. memcpy 문제가 발생했습니다
- 17. 버퍼에 정수 복사하기 memcpy C++
- 18. 사용자 공간에서 커널 공간으로의 memcpy
- 19. C++ new/new [], 어떻게 메모리를 할당합니까?
- 20. memcpy 및 C++ 클래스 템플릿 - 사용 방법은 무엇입니까?
- 21. VB.NET/ASP.NET With 및 New keyword muddle
- 22. new as3 .. 클래스 구조체 및 스프라이트
- 23. new 및 delete char * 예외가 발생합니다.
- 24. New to
- 25. memmove() O (n) 또는 O (1)을 고려해야합니까?
- 26. new google.maps.LatLngBounds() 및 Android 및 Google지도의 메모리 누출량
- 27. OpenCL 커널에서 "memcpy"를 대체해야하는 것은 무엇입니까?
- 28. NUMA에서 malloc/memcpy 기능을 독립적으로 실행합니까?
- 29. memcpy in C# 다른 데이터 유형
- 30. memcpy 문제; 복사 잘못된 블록을 여러 번
memcpy 외에도 문제가 없지만 단순히 std :: string을 사용하지 않는 이유는 무엇입니까? –
send() 및 recv()에 전달 될 것이기 때문에 std :: string.c_str()의 전체 중간 사람을 건너 뛰고 싶습니다. – Pragma
다음 std :; 벡터은 아마도 당신이 원하는 것일 것입니다. 그리고 중매인은 당신의 친구입니다. –