C++

You are currently browsing articles tagged C++.

(이 글은 2007년 1월 16일에 DokuWiki 에서 작성된 http://j.strane.net/dokuwiki/blog/2007/c_labyrinth_1 를 WordPress 로 옮긴 것입니다.)

Code

#include <iostream>
#include <string>
using namespace std;

class A
{
public:
    A () {};

    operator string() { return "It's A!"; };
};

class B
{
public:
    B () {};
    B (const A& temp) {};

    operator string() { return "It's B!"; };
};

int main()
{
    A a;
    B b;
    string sTemp = (true ? a : b);

    cout < < "What do you expect?" << endl;
    cout << "Unfortunately, " << sTemp << endl;

    return 0;
}

Question

위 코드를 실행했을 때 예상되는 출력 결과는 무엇일까요?

  1. 위 코드는 gcc 3.3.5 에서 -Wall 옵션으로 워닝이나 에러없이 컴파일됩니다.
  2. 리플에 정답이나 힌트가 올라올 수 있습니다. 여기까지 읽으셨다면 문제에 필요한 내용은 다 읽으신 것이니 곰곰이 생각해보시거나 컴파일하고 돌려보신 후에 더 읽기를 눌러주세요.

Read the rest of this entry »

Tags: , ,

보통 C++ 프로그래머들이 코드를 작성할 때 STL 에 대한 믿음은 꽤나 크다. 나 역시 STL 은 범용적으로 사용 가능하도록 잘 최적화되어 있고 웬만한 프로그래머가 직접 짜는 것보다는 훨씬 잘 짜여져있다고 믿는 편이다. 대부분의 경우 이런 우리의 생각은 옳고, 우리가 쉽게 생각하기 어려운 부분들까지 고려하여 잘 구현되어 있다.

하지만 가끔은 우리가 STL 을 지나치게 만능으로 생각하고 있었다는 것이 증명되기도 한다. 특히 표준에 complexity 가 정확히 명시되어 있지 않은 부분들은 컴파일러에 따라 상당히 비효율적으로 구현된 경우도 있다.

이번에 심심해서 grep-like 한 툴을 짜고 있는데 그 중 생각없이 std::string 의 find() 멤버 함수를 썼다가 알게된 점들에 대해서 포스팅을 한다.

우선 SGI 의 STL 레퍼런스를 참조해보자.

basic_string

size_type find(const basic_string& s, size_type pos = 0) const

Searches for s as a substring of *this, beginning at character pos of *this.

흐음 … 이제 뭔가 입질 감이 오지 않는가? 이렇게 구현에 대해 입 한번 뻥긋하지 않을 정도면 보통 두가지 결론이 나올 수 있다. 첫째는 우리가 생각할 필요없이 잘 구현되어 있다. 걱정하지 말고 사용해라. 라는 경우와 둘째는 표준에서 딱히 정해진게 없으니 구현에 따라 다를 수 있다. 라는 경우이다.

그런데 보통 STL 사용자들은 std::string 의 find() 멤버 함수면 적어도 스트링에 최적화된 서치 알고리즘이 구현되어 있으리라 예상한다. 하지만 과연 그럴까? 아래 코드를 한번 보자.
Read the rest of this entry »

Tags: , ,

Newer entries »