ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
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À» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|