2010-03-10 3 views
3

새로운 배열을 사용하여 char 배열에 데이터를 저장하는 간단한 바이트 버퍼를 만들고 있습니다. memcpy 및 memmove 함수가 새로운 메모리로 사용되는 경우 이상한 것을 제공하는지 궁금합니다. 아니면 대신하는 것이 좋습니다 것이 있습니까?memmove, memcpy 및 new

+1

memcpy 외에도 문제가 없지만 단순히 std :: string을 사용하지 않는 이유는 무엇입니까? –

+1

send() 및 recv()에 전달 될 것이기 때문에 std :: string.c_str()의 전체 중간 사람을 건너 뛰고 싶습니다. – Pragma

+4

다음 std :; 벡터 은 아마도 당신이 원하는 것일 것입니다. 그리고 중매인은 당신의 친구입니다. –

답변

3

아니요, 괜찮습니다. newmalloc()은 힙에 메모리를 확보 할 수있는 두 가지 다른 방법 일뿐입니다. 실제로 대부분의 구현에서 newmalloc()을 사용하기 때문에 실제로 동일합니다. 손에 유효한 char* 변수 (new, malloc() 또는 스택에 할당 됨)를 갖게되면 메모리에 대한 포인터가되므로 memcpy() 및이 패밀리의 다른 기능이 예상대로 작동합니다.

+0

유효한'char *'변수가 있어야한다는 것에주의해야합니다. 'char * c = NULL;'또는'char * c = 0xfacefeed;'는 아마도'memcpy()'나'memmove()'와 잘 일치하지 않을 것이다. –

+0

이 케이스를 명확히하기 위해 편집 됨. 감사! – pajton

4

memcpy()/memmove()을 사용하면 해당 종류의 데이터에서 올바르게 작동합니다. 일반적으로 모든 POD 유형에서 안전하게 사용할 수 있습니다.

+4

POD-ness가 핵심입니다. –

2

char 배열 데이터의 경우 new와 함께 사용해도 정상적으로 작동해야합니다.

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

0

나는 여전히 std :: copy와 함께 vector를 사용할 것이지만, 새로운/memcpy/memmove가 좋지 않다는 것을 의미하지는 않는다. 버퍼 안에서 움직이는 부분을 고집한다면 memmove가 실제로 선호됩니다.

1

실제로 플랫폼에 따라 다르며 컴파일러의 구현은 newmemmove입니다. 대부분의 프로세서 아키텍처는 워드 경계에서 정렬 될 때 데이터를보다 잘 섞습니다. 그러나 일부는 더 나은 성능을 발휘하는 추가 사례를 가지고 있습니다. 예를 들어, 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++ 표준에서 정렬을 지정하는 어떤 것도 아키텍처 특정 최적화가 될 것이므로 믿지 않는다.

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

+0

"새 연산자는 반환되는 포인터 앞에 몇 바이트에 할당 된 메모리 블록에 대한 메타 데이터를 저장할 수 있으므로 실제 포인터는 단어의 두 번째 또는 두 번째 실제 할당 시작 지점입니다."- 그렇다면 malloc()과 같습니다. –

+0

예. 그냥 malloc처럼. 일부 플랫폼은 메모리의 정렬 경계를 지정할 수있는 대체 메모리 할당 기능을 제공합니다. 정말로 정렬에 관심이 있다면, 이러한 루틴 중 하나를 찾아야합니다. –