2010-05-24 5 views
1

Obj-C 프로그램 내에서 memset 또는 memcpy를 사용할 때 컴파일러는 데이터의 설정 (memset) 또는 복사 (memcpy)를 32 비트 쓰기로 최적화 할 것인가 아니면 바이트 단위로 수행할까요?memcpy/memset 사용

+1

정렬 문제와 같은 특수한 경우를 제외하고 바이트 단위로이 작업을 수행하는 현대적인 구현이 있는지 의심 스럽습니다. – Ofir

답변

0

Memset은 표준 C 라이브러리의 일부로 제공되므로 사용중인 구현에 따라 달라집니다. 나는 대부분의 구현이 네이티브 CPU 크기 (32/64 비트)와 나머지 바이트 단위로 블록을 복사 할 것입니다.

void * 
memcpy (dstpp, srcpp, len) 
    void *dstpp; 
    const void *srcpp; 
    size_t len; 
{ 
    unsigned long int dstp = (long int) dstpp; 
    unsigned long int srcp = (long int) srcpp; 

    /* Copy from the beginning to the end. */ 

    /* If there not too few bytes to copy, use word copy. */ 
    if (len >= OP_T_THRES) 
    { 
     /* Copy just a few bytes to make DSTP aligned. */ 
     len -= (-dstp) % OPSIZ; 
     BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ); 

     /* Copy whole pages from SRCP to DSTP by virtual address manipulation, 
    as much as possible. */ 

     PAGE_COPY_FWD_MAYBE (dstp, srcp, len, len); 

     /* Copy from SRCP to DSTP taking advantage of the known alignment of 
    DSTP. Number of bytes remaining is put in the third argument, 
    i.e. in LEN. This number may vary from machine to machine. */ 

     WORD_COPY_FWD (dstp, srcp, len, len); 

     /* Fall out and copy the tail. */ 
    } 

    /* There are just a few bytes to copy. Use byte memory operations. */ 
    BYTE_COPY_FWD (dstp, srcp, len); 

    return dstpp; 
} 

그래서 다시 바이트 그리고 마지막, 즉 그것을 다음 몇 바이트 먼저 정렬하려면 사본, 사본을 볼 수

다음은 예제 구현을위한 방어 적이기의의 glibc의 버전입니다. 일부 커널 작업을 사용하여 최적화 된 페이지 복사를 수행합니다.

2

Darwin source에서 이러한 방법의 libc 구현을 볼 수 있습니다. 10.6.3에서 memset은 단어 단위로 작동합니다. memcpy는 확인하지 않았지만 아마도 동일합니다.

이 기능을 호출하는 대신 컴파일러에서 작업을 인라인으로 처리하는 것이 맞습니다. 나는 내가 문제를 기대하지는 않을지라도, 더 잘 알고있는 사람에게 그것이 무엇을 할 것인지를 대답하게 할 것이라고 생각한다.