programing tip

"바이트 수"를 0으로 설정하여 memcpy () 및 memmove ()를 호출 할 수 있습니까?

itbloger 2020. 9. 8. 07:43
반응형

"바이트 수"를 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;
}

함수 호출 이외의 성능 저하도 없어야합니다. 컴파일러가 이러한 함수에 대한 내장 / 인라이닝을 지원하는 경우 추가 검사는 그 동안 이미 검사가 수행 되었기 때문에 코드를 조금 더 느리게 만들 수도 있습니다.

참고 URL : https://stackoverflow.com/questions/3751797/can-i-call-memcpy-and-memmove-with-number-of-bytes-set-to-zero

반응형