본문 바로가기

it관련

스트링복사(strcpy)함수와 아스키 문자열

반응형

스트링복사(strcpy)함수와 아스키 문자열


씨언어의 스트링은 바이트단위로 구성된다

 

다른 언어의 스트링과 다르게도 구조가 단순하다, 아스키문자의 배열에 대해서 '\0' 를 문자열의 끝으로 간주한다, 베이직이나 파스칼의 경우에는 스트링내에서 '\0' 값을 문자로 처리가 가능하고 문자열의 길이를 저장해서 사용한다, 특히 베이직이나 자바의 경우에는 사용중에 스트링의 길이가 바뀌더라도 메모리의 관리가 자동으로 이루어지므로 메모리의 문제가 일어나지 않는다, 이에 대한 씨언어의 해결책은 CString 이나 string 라이브러리를 사용하는 것이다

 

그러면 ASCIIZ 의 문자열에 문제가 있는 것일까

그렇지는 않다

문자의 구성상 0 를 빼면 255 의 문자값이 존재할 수 있다, 문자열의 길이가 2 가 되면 255²=65,025 길이가 3 이 되면 255³=16,581,375 의 경우가 된다 같은 방법으로 n 길이의 문자열은 255ⁿ 의 경우의 수를 가지게 된다, 때문에 길이가 매우 긴 처리를 요구하지 않는 한은 따로 스트링의 길이를 저장한다든지의 특별한 스트링관리가 필요없다, 그래서 씨의 스트링이 문자의 나열과 문자값 0 의 끝으로 구성된다, 그래서 ASCIIZ 로 부르게 된다

 

그렇지만 거의 언제나 문자단위로 접근해야하는 구조이다

 

제목과 같이 strcpy 함수에 대해서 바이트단위의 접근구조를 약간 바꿔서 4바이트단위로 읽고 4바이트단위로 쓰게 만들어보았다

 

[code]

char * __cdecl strcpy_chunk(char *de, char *so)

{

    char *re = de;

    long c;

    while(1)

    {

        *(long *)de = c = *(long *)so;

        if((char)(c >> 0) == 0) break;

        if((char)(c >> 8) == 0) break;

        if((char)(c >> 16) == 0) break;

        if((char)(c >> 24) == 0) break;

        de += sizeof(long);

        so += sizeof(long);

    }

    return  re;

}

char * __cdecl strcpy_ms(char * dst, const char * src)

{

    char * cp = dst;

    while(*cp++ = *src++);

    return  dst;

}

[/code]

 

위의 첫 번 함수는 4바이트단위로 읽고 쓴다 두번째는 비교를 위한, 마소의 라이브러리의 소스와 같다

결과는 성공적이다, 표준라이브러리보다 대략 60퍼센트 더 빠른 성능이었다, 문제는 ASCIIZ 를 사용하는데는 반드시 '\0' 를 테스트해야 하는 점이고 또 다른 문제는 출력되는 버퍼메모리의 alignment 가 반드시 4바이트에 놓여야 하는데, 보통 버퍼의 크기를 2 의 지수승정도에 alignment 로 잘 맞추고 프로그램 히프메모리가 항상 4/8/16 바이트의 alignment 가 자동이란 점에서 문제는 없어보였다

 

그럼 또 다른 의문이 있다

요즘과 같은 다중언어라든가 유니코드가 존재하는데 ASCIIZ 를 쓰겠는가

답은, 아스키문자를 그대로 쓴다 이다

 

요즘의 가장 보편적인 웹환경이나 자바환경 그리고 컴퓨터언어는 ascii 를 사용한다

그래서 전송에서나 저장에서의 이득을 빼고서라도 처리의 효율에 있어서는 ascii 체계를 그대로 사용할 것이다

 

네트웍에서 가장 보편적으로

<html>

 ....

</html>

로 쓰다가

 

< h t m l >

 ....

< / h t m l >

로 쓰면 너무 어색하므로

 

 

웹환경하에서 다중언어지원으로써 모든 환경의 접근마저도 다중언어에 맞출 필요는 없어보인다

그러므로 아스키문자의 배열이 어디에서 쓰이든지 문자값의 조합이 지수승의 경우를 지니므로 씨언어에서 ASCIIZ 를 택했고 많은 다른 분야에서도 ASCIIZ 를 그대로 사용할 것이라고 늦으나마 확신해도 좋다

반응형