반응형
"바이트 수"를 0으로 설정하여 memcpy () 및 memmove ()를 호출 할 수 있습니까?
나는 actully 이동에 아무것도 없을 때 / 치료의 경우에 필요로 복사합니까 memmove()
/ memcpy()
에지의 경우와 같은
int numberOfBytes = ...
if( numberOfBytes != 0 ) {
memmove( dest, source, numberOfBytes );
}
또는 확인하지 않고 함수를 호출해야
int numberOfBytes = ...
memmove( dest, source, numberOfBytes );
이전 스 니펫의 확인이 필요합니까?
C99 표준 (7.21.1 / 2)에서 :
로 선언 된 인수
size_t n
가 함수에 대한 배열의 길이 를 지정하는 경우 해당 함수n
에 대한 호출에서 값 0을 가질 수 있습니다. 이 하위 절의 특정 함수에 대한 설명에서 달리 명시 적으로 언급되지 않는 한, 그러한 호출에 대한 포인터 인수는 7.1.4에 설명 된대로 여전히 유효한 값을 가져야합니다. 이러한 호출에서 문자를 찾는 함수는 발생을 찾지 못하고 두 문자 시퀀스를 비교하는 함수는 0을 반환하며 문자를 복사하는 함수는 0 개의 문자를 복사합니다.
그래서 대답은 아니오입니다. 확인이 필요하지 않습니다 (또는 예, 0을 통과 할 수 있음).
@You가 말했듯이 표준은 memcpy와 memmove가 문제없이이 경우를 처리하도록 지정합니다. 그들은 일반적으로 어떻게 든 다음과 같이 구현되기 때문에
void *memcpy(void *_dst, const void *_src, size_t len)
{
unsigned char *dst = _dst;
const unsigned char *src = _src;
while(len-- > 0)
*dst++ = *src++;
return _dst;
}
함수 호출 이외의 성능 저하도 없어야합니다. 컴파일러가 이러한 함수에 대한 내장 / 인라이닝을 지원하는 경우 추가 검사는 그 동안 이미 검사가 수행 되었기 때문에 코드를 조금 더 느리게 만들 수도 있습니다.
반응형
'programing tip' 카테고리의 다른 글
new operator [duplicate]보다 std :: make_unique 사용의 장점 (0) | 2020.09.08 |
---|---|
프레임 워크에서 프레임 워크 없음으로 전환 (0) | 2020.09.08 |
여러 CSS / JS 파일 결합 및 축소 (0) | 2020.09.08 |
명령 프롬프트는 종료 대기 시점을 어떻게 알 수 있습니까? (0) | 2020.09.08 |
약속 : 다음 대 다음 + 잡기 (0) | 2020.09.08 |