Microsoft MVP성태의 닷넷 이야기
VC++: 98. 원본과 대상 버퍼가 같은 경우 memcpy, wmemcpy 주의점 [링크 복사], [링크+제목 복사],
조회: 26787
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

원본과 대상 버퍼가 같은 경우 memcpy, wmemcpy 주의점

Visual C++로 다음의 코드를 컴파일해 실행하면,

#include <iostream>
#include <string.h>

int main()
{
  char word[6] = {'a', 'b', 'c', 'd', 'e', '\0' };
  
  memcpy(word, word + 1, 5);
  
  std::cout << word;
  
  return 0;
}

x86/x64, Debug/Release에 상관없이 "bcde" 결과를 볼 수 있습니다.

반면 다음의 사이트에서 컴파일해 보면,

C++ Shell
; http://cpp.sh/

C++ 최적화 옵션에 따라 결과가 다음과 같이 나옵니다.

// C++14, Optiminzation level == None

bdee

// C++14, Optiminzation level != None

bcde

찾아보니, 이런 불확실성이 문서에 기재되어 있습니다.

memcpy, memcpy_s
; http://en.cppreference.com/w/c/string/byte/memcpy

If the objects overlap, the behavior is undefined. 

MSDN 문서도 같은 설명을 포함합니다.

memcpy, wmemcpy
; https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/memcpy-wmemcpy

 If the source and destination overlap, the behavior of memcpy is undefined. Use memmove to handle overlapping regions.

그나마 더 친절하군요. ^^ 이런 경우라면 대신 memmove를 쓰라고 안내까지 합니다.

memmove, wmemmove
; https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/memmove-wmemmove

If some regions of the source area and the destination overlap, both functions ensure that the original source bytes in the overlapping region are copied before being overwritten.

따라서, 특별히 대단한 성능이 요구되는 경우가 아니라면 안전하게 memmove를 쓰는 것이 더 권장됩니다.

근래에 두 함수 모두 똑같은 기능을 갖는 것으로 보인다고 하는 의견이 있는데, 그건 Visual C++에 한해서일 뿐 다른 C/C++ 컴파일러로 가면 역시나 그 결과는 보장할 수 없습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 7/17/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 166  167  168  169  170  171  172  [173]  174  175  176  177  178  179  180  ...
NoWriterDateCnt.TitleFile(s)
747정성태7/1/200948333.NET Framework: 149. WPF - UI 업데이트를 바로 반영하고 싶다면? [3]파일 다운로드1
746정성태6/25/200935495.NET Framework: 148. WPF - 데이터 바인딩 시의 예외 처리 방법 [1]파일 다운로드1
745정성태6/22/200927219.NET Framework: 147. WPF - Binding에 Sibling 요소 지정 [2]파일 다운로드1
744정성태6/21/200925899.NET Framework: 146. WPF - 중첩된 ScrollViewer의 크기 제어 [2]파일 다운로드1
743정성태6/17/200930381.NET Framework: 145. Unity Container 개체 풀이
742정성태6/17/200929757.NET Framework: 144. WPF - FrameworkElement.Parent 속성이 null이라면? [3]
740정성태6/12/200927360.NET Framework: 143. WPF - Transform의 역변환파일 다운로드1
739정성태6/8/200940446.NET Framework: 142. WPF - Grid 컨트롤의 ShowGridLine 개선 [5]파일 다운로드1
737정성태6/6/200946598.NET Framework: 141. Win32 Interop - 크기가 정해지지 않은 배열을 C++에서 C#으로 전달하는 경우파일 다운로드2
734정성태6/4/200928881.NET Framework: 140. WPF - CellPadding 속성을 구현하는 Grid Layout [2]파일 다운로드1
733정성태5/29/200934286.NET Framework: 139. WPF - "M/d/yyyy h:mm:ss tt" 형식으로만 날짜를 출력하는 문제
732정성태5/27/200929283Team Foundation Server: 32. 팀 빌드 오류 확인 방법
731정성태5/27/200924086Team Foundation Server: 31. 팀 빌드 스케줄 확인 방법
730정성태5/26/200930224VS.NET IDE: 63. Visual Studio 2010 - Parallel Stacks [1]
729정성태5/25/200929577.NET Framework: 138. InternalsVisibleTo와 Public Key 값
728정성태5/23/200939885.NET Framework: 137. C#에서 Union 구조체 다루기파일 다운로드1
727정성태5/22/200924957오류 유형: 82. 메서드가 많은 경우 프록시 클래스 생성 실패
726정성태5/21/200924283VS.NET IDE: 62. Visual Studio 2010 Beta1 버그 피드백 - EnC기능 오류 [1]
725정성태5/21/200927888VS.NET IDE: 61. Visual Studio 2010 베타1과 Visual Studio 2008의 혼합 개발 [2]
724정성태5/19/200943396.NET Framework: 136. 자바와 닷넷의 압축 호환파일 다운로드2
723정성태5/18/200936340.NET Framework: 135. C# - Deflate, GZip, Zip
722정성태5/18/200924358개발 환경 구성: 45. SQL 서버 2008 백업 구성 [2]
721정성태5/14/200930224오류 유형: 81. Package 실행 오류 - Error 15404
720정성태5/13/200927028오류 유형: 80. SQL Server 2008 - Package 실행 오류의 구체적인 원인 확인
719정성태5/12/200928293.NET Framework: 134. WPF - XBAP을 호스팅하고 있는 인터넷 익스플로러 인터페이스 구하기파일 다운로드1
717정성태5/11/200928556개발 환경 구성: 44. VHD 파일 크기 확장하는 방법 - 두 번째 이야기
... 166  167  168  169  170  171  172  [173]  174  175  176  177  178  179  180  ...