memcpy:minzknÀÇ ´ä
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Àú ¿ª½Ã 4 - 2 - 1 alignment ¼øÀ¸·Î º¹»ç¸¦ Çϵµ·Ï ±¸ÇöÇÏ¿´½À´Ï´Ù. 1 - 2 - 4 ¼øÀ¸·Î ±¸ÇöÇÒ¼öµµ ÀÖÁö¸¸ ´ëºÎºÐ °¡¸£Å°´Â Æ÷ÀÎÅÍ ´ë»óÀº ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ¼­ 4byte alignment µÈ ½ÃÀÛÀ§Ä¡¸¦ °®±â ¶§¹®¿¡ 4 - 2 - 1 ¼øÀÇ ±¸Á¶°¡ º¸´Ù À¯¸®ÇÕ´Ï´Ù.

±×¸®°í ½ÇÁ¦·Î ´ëºÎºÐÀÇ °³¹ßȯ°æ¿¡¼­ memcpy ´Â inline À¸·Î ±¸ÇöµË´Ï´Ù. ¶ÇÇÑ »ó¼öÀÎÀÚÁ¶°Ç¿¡ ´ëÇØ¼­ °£·«È­ÇÑ ¶Ç ´Ù¸¥ inline 󸮸¦ Çϴ°ÍÀÌ º¸ÅëÀÔ´Ï´Ù.
¿¹¸¦ µé¾î¼­ memcpy ÀÇ Å©±âÀÎÀÚ°¡ »ó¼öÁ¶°ÇÀ̶ó¸é(º¯¼öÁ¶°ÇÀÌ ¾Æ´Ñ) À̰ÍÀº ·çÇÁ¾øÀÌ º°·Îµµ ±¸ÇöÇÒ¼ö ÀÖ´Â Á¶°ÇÀÌ µË´Ï´Ù.
Áï, "memcpy(to, from, 4)" ÀÇ °æ¿ì´Â "*((dword *)to) = *((dword *)from)" À¸·Î ±¸ÇöµÉ¼ö ÀÖ½À´Ï´Ù.
Àú´Â ±×·¯ÇÑ »ó¼ö½Ä¿¡ ´ëÇÑ ÄÄÆÄÀÏ ÃÖÀûÈ­¸¦ °í·ÁÇÏ¿© ÀÛ¼ºÇÏ¿´½À´Ï´Ù.

Áï, ¾Æ·¡ÀÇ mzmemcpy ÇÔ¼ö´Â macro¿Í inline ÀÇ Á¶ÇÕÀ̰í Header ¿¡ ¸í½ÃÇÏ¿© »ç¿ëÇÒ Àǵµ¸¦ °®°í ÀÖ½À´Ï´Ù.

/* 
 Copyright (C) Information Equipment co.,LTD. 
 All rights reserved. 
 Code by JaeHyuk Cho <mailto:minzkn@infoeq.com> 
 
 ID="$Id: Site_2fTest_2fMemcpy_2fByminzkn,v 1.1 2007/01/09 02:46:19 root Exp root $" 
*/ 
 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 
 
#if defined(__GNUC__) 
# define mzmemcpy(m_to,m_from,m_size) (\ 
 __extension__(\ 
  __builtin_constant_p(m_size) ? \ 
   (\ 
    ((m_size) == 1) ? \ 
     (\ 
      mzmemcpy_1(m_to,m_from)\ 
     ) : \ 
     (\ 
      ((m_size) == 2) ? \ 
       (\ 
        mzmemcpy_2(m_to,m_from)\ 
       ) : \ 
       (\ 
        ((m_size) == 4) ? \ 
         (\ 
          mzmemcpy_4(m_to,m_from)\ 
         ) : \ 
         (\ 
          mzmemcpy_generic(m_to,m_from,m_size)\ 
         )\ 
       )\ 
     )\ 
   ) : \ 
   mzmemcpy_generic(m_to,m_from,m_size)\ 
 )\ 
) 
#else 
# define mzmemcpy(m_to,m_from,m_size) mzmemcpy_generic(m_to,m_from,m_size) 
#endif 
 
static __inline void *mzmemcpy_1(void *s_to,const void *s_from) 
{ 
 *((unsigned char *)s_to) = *((unsigned char *)s_from); 
 return(s_to); 
} 
 
static __inline void *mzmemcpy_2(void *s_to, const void *s_from) 
{ 
 *((unsigned short int *)s_to) = *((unsigned short int *)s_from); 
 return(s_to); 
} 
 
static __inline void *mzmemcpy_4(void *s_to, const void *s_from) 
{ 
 *((unsigned int *)s_to) = *((unsigned int *)s_from); 
 return(s_to); 
} 
 
static __inline void *mzmemcpy_generic(void *s_to, const void *s_from, size_t s_size) 
{ 
 void *s_temp_to = s_to; 
 size_t s_count = s_size & (~3); 
 while((s_temp_to - s_to) < s_count) 
 { 
  *((unsigned int *)s_temp_to) = *((unsigned int *)s_from); 
  s_temp_to += 4, s_from += 4; 
 } 
 s_size &= (size_t)3; 
 while(s_size > ((size_t)0)) 
 { /* byte */ 
  *((unsigned char *)s_temp_to) = *((unsigned char *)s_from); 
  s_temp_to += 1, s_from += 1; 
 } 
 return(s_to); 
} 
 
/* ------------------------------------------------------ */ 
 
struct ts_test_data 
{ 
 int age; 
 char name[24]; 
 char flags; 
}; 
 
int main(int s_argc, char *s_argv[]) 
{ 
 int s_count; 
 struct ts_test_data s_to, s_from; 
 clock_t s_begin, s_end, s_tick; 
 
 s_from.age = 29; 
 s_from.flags = 0xc7; 
 (void)strcpy((char *)(&s_from.name[0]), "minzkn"); 
 
 s_begin = clock(); 
 for(s_count = 0;s_count < 10000000;s_count++) 
 { 
 #if 0 /* standard */ 
  (void)memcpy((void *)(&s_to), (void *)(&s_from), (size_t)sizeof(s_from)); 
 #else /* minzkn */ 
  (void)mzmemcpy((void *)(&s_to), (void *)(&s_from), (size_t)sizeof(s_from)); 
 #endif 
 } 
 s_end = clock(); 
 
 s_tick = ((s_end - s_begin) * ((clock_t)1000)) / CLOCKS_PER_SEC; 
 (void)fprintf(stdout, 
  "time: %u.%03ums\n" 
  "age: %d\n" 
  "name: %s\n" 
  "flags: %02XH\n", 
  ((unsigned int)s_tick) / 1000u, ((unsigned int)s_tick) % 1000u, 
  s_to.age, 
  (char *)(&s_to.name[0]), 
  ((unsigned int)s_to.flags) & 0xffu 
 ); 
 return(0); 
} 
 
/* End of source */ 
 

´ÙÀ½Àº Å×½ºÆ® °á°ú ÀÔ´Ï´Ù.
bash# ./test 
time: 0.100ms 
age: 29 
name: minzkn 
flags: C7H 
 

´ÙÀ½Àº glibc ÀÇ memcpy ·Î Å×½ºÆ®¸¦ ¼öÇàÇÑ °á°úÀÔ´Ï´Ù.
time: 0.050ms 
age: 29 
name: minzkn 
flags: C7H 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.