티스토리 뷰

hacking

Isn't C wonderful?

iolo 2005. 12. 17. 10:58

GTK 메일링에 const char *strconst char str[]이렇게 바꾸는 기여를 하겠다는 사람이 나타났다.

응? 물론 나도 후자를 좋아한다. 다만 내가 후자를 좋아하는 이유는 그것이 더 명확하기 때문이다. 심지어 char str[]보다 char[] str을 선호한다. 즉, str이라는 변수는 배열이며, 그 배열의 요소는 char라는 사실이 더욱 명확하다는 거다.

그런데, 메일링의 얘기는 그것과 다른 이유에서 였다. 후자가 더 효율적이라는 것이다.

응? 뭐가? 라고 궁금해하는 것은 나만이 아니었다. C도 나름대로 쓴다고 생각했지만... 그것은 오만~ 역시 세상엔 꼴통들이 많다.

Xavier Bestel이 눈으로 직접 확인 시켜 주었다:
static const char *str1 = "azerty";
static const char str2[] = "azerty";
void f(const char *x);
void try(void)
{
        f(str1);
        f(str2);
}
이 코드를 gcc 4.0.3 -O2로 컴파일하면,

str2는 말 그대로 문자 배열이다:
str2:
        .string "azerty"

str1도 문자 배열에 대한 포인터다(C 구문을 그대로 해석하면 문자 배열의 첫번째 문자에 대한 포인터다):
.LC0:
        .string "azerty"
str1:
        .long   .LC0
그래도 모르겠다고? 그럼 이 변수들을 참조하는 방식을 살펴보자.

f(str1)str1을 간접 참조한다:
        movl    str1, %eax
        pushl   %eax
        call    f

f(str2)는 주소 그 자체다:
        movl    $str2, (%esp)
        call    f

뭔가 오묘하지 않나?

Isn't C wonderful?

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함