일부 영역 (예 : 게임 산업)에서는 STL이 권장되지 않습니다. 그래서 내 질문은 : 어떤 경우에는 STL을 사용하지 않는 것이 실제로 좋은 습관입니까? 그렇다면 현대 C ++의 STL을 사용하지 않는 가장 큰 이유는 무엇입니까?
일부 영역 (예 : 게임 산업)에서는 STL이 권장되지 않습니다. 그래서 내 질문은 : 어떤 경우에는 STL을 사용하지 않는 것이 실제로 좋은 습관입니까? 그렇다면 현대 C ++의 STL을 사용하지 않는 가장 큰 이유는 무엇입니까?
답변:
나는 단 하나의 타당한 이유 만 생각할 수 있으며 정말 드물다 : 어려운 실시간. 표준 라이브러리의 많은 것들이 내부적으로 메모리를 할당하므로 하드 실시간 응용 프로그램에는 결정 론적이지 않으므로 피해야합니다. 이러한 응용 프로그램은 일반적으로 매우 단순하지만 매우 엄격한 검토 및 테스트로 인해 개발하는 데 시간이 오래 걸립니다.
계산 복잡성을 이해하지 못하고 STL을 오용 한 다음 라이브러리를 비난하는 개발자는 잘못되었지만 매우 일반적인 이유를 생각할 수 있습니다.
STL은 일반적으로 콜백 포인터가있는 C 스타일 솔루션 또는 가상 메소드가있는 다형성 기반 솔루션보다 런타임에 더 빠릅니다 ( 이 Bjarne Stroustrup의 기조 참조 ). 그러나 개발자가 복잡한 사양을 이해하지 못하고 복잡한 객체의 벡터로 구성된 벡터를 생성하여 라이브러리를 잘못 사용하면 (C ++ 11에서는 더 이상 문제가 아닙니다!) 성능 문제가 발생하고 스스로 방어하는 것 "알다시피, 벡터는 다소 느리다"고 표준 라이브러리가 느리다는 인식을 일으킬 수 있습니다. 관리자가 그러한 인식을 얻으면 조직에서 매우 오래 살 수 있습니다.
분명히 대상 플랫폼이 지원하지 않는 것은 사용할 수 없습니다. 그러나 우리는 현재 4 개의 가장 일반적인 모바일 플랫폼 (Android, iOS, Bada 및 이전 WinCE)을 대상으로하고 있으며 표준 라이브러리와 Boost의 일부 를 모두 사용합니다.
많은 표준 라이브러리는 WinCE 초기에 Microsoft에 의해 지원되지 않았지만 (IIRC iostream은 Visual Studio 2005에서만 제공됨 ), 그보다 훨씬 전에 STLport 를 사용할 수 있었습니다 . 그리고 당신은 일반적으로 무엇이든 컴파일 할 수 있습니다. 그래서 나는이 이유를 무효라고 부릅니다.
게다가, 그것은 오랫동안 "STL"이 아니라 ANSI C ++ 표준 라이브러리입니다. 언어 자체를 정의하는 매우 동일한 표준 문서로 정의됩니다. 이를 지원하지 않는 것은 실제로 C ++이라고 할 가치가 없습니다.
sprintf
종종 메모리도 할당합니다. 실시간 플랫폼에서 표준 라이브러리 기능에도 결정적인 한계가 있습니다. 따라서 실시간 C ++ 구현이 어려워집니다. 전체 C ++ 표준 라이브러리를 신중하게 개발해야합니다.이 라이브러리는 작은 C 표준 라이브러리보다 더 많은 작업입니다.
나는 STL을 사용하고 있으며 이미 몇 년 동안 부스트했습니다. 이를 포기하고 사용자 지정 도구를 사용하려는 경우 동기는 다음과 같습니다.
C ++ 표준 템플릿 라이브러리를 사용하지 않는 한 가지 큰 이유가 있습니다. 대상 플랫폼 중 하나에 완전히 호환되는 구현이 없거나 전혀 구현되지 않았으며 하나를 얻지 못할 것이라는 것을 알고 있습니다. 다음 몇 년 안에.
나는 복잡성 (구현 효율)에 대해서는 알지 못하지만 표준 컨테이너 대신 Qt 컨테이너와 문자열을 광범위하게 사용하고 있으며 잘 작동합니다. 또한 세트 및 목록의 Qt 구현이 더 사용하기 쉽다는 것을 알았습니다.
따라서 필요에 맞는 다른 라이브러리를 사용할 수 있다면 STL을 포기하는 것이 실용적 일 수 있습니다.
QList<T>::iterator
그렇게해야 할 이유가 없다면 실용적이지 않습니다. 내가 생각할 수있는 그런 이유 중 일부는 STL (또는 표준 라이브러리의 다른 부분) 또는 부분적으로 구현이 부족하거나 리소스 제한 (메모리, CPU 속도, 스토리지 등)을 포함합니다. 달성해야 할 것을 고수하는 자신의 도구를 굴립니다.
게임 산업에서 대부분 (더 작은 규모까지) 스튜디오는 내부 라이브러리와 대상 플랫폼에 맞게 조정 된 많은 표준 라이브러리 파트의 구현을 가지고 있으며 경우에 따라 영어 또는 게임 자체를 대상으로합니다. 콘솔 게임을 개발할 때 하드웨어는 오늘날의 표준에 따라 매우 제한됩니다. 한 가지 이유 때문에 수천 줄의 수공 조립품이 있습니다. 코드에서 모든 종류의 리소스 풋 프린트를 최소화하여 게임이 더 빨리 실행되도록하여 게임 세계 (또는 더 큰 세계)에서 더 많은 콘텐츠를 허용함으로써 더 나은 제품을 만들 수 있도록하는 것이 매우 중요합니다.
"모든 성공적인 게임은 자신 만의 링크 된 목록 구현을 시작함으로써 시작됩니다."