C ++ 개발에서 STL을 포기하는 것이 실용적입니까? [닫은]


19

일부 영역 (예 : 게임 산업)에서는 STL이 권장되지 않습니다. 그래서 내 질문은 : 어떤 경우에는 STL을 사용하지 않는 것이 실제로 좋은 습관입니까? 그렇다면 현대 C ++의 STL을 사용하지 않는 가장 큰 이유는 무엇입니까?



내 동료 중 일부는 반복자가 디버깅하기가 쉽지 않기 때문에 반복자가 디버깅을 더 어렵게 만든다고 주장하며 이는 람다에도 적용됩니다. 당신의 대답은 무엇입니까?
CaptainJH

디버깅 중 물건을 건너 뛰는 것에 대해서는 예를 들어 stackoverflow.com/questions/2062881/…
Martin Ba

이것은 좋은 질문처럼 보입니다. "프로젝트가 왜 STL을 사용하지 않겠습니까?"
Matthew James Briggs

답변:


25
  • 나는 단 하나의 타당한 이유 만 생각할 수 있으며 정말 드물다 : 어려운 실시간. 표준 라이브러리의 많은 것들이 내부적으로 메모리를 할당하므로 하드 실시간 응용 프로그램에는 결정 론적이지 않으므로 피해야합니다. 이러한 응용 프로그램은 일반적으로 매우 단순하지만 매우 엄격한 검토 및 테스트로 인해 개발하는 데 시간이 오래 걸립니다.

  • 계산 복잡성을 이해하지 못하고 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 ++이라고 할 가치가 없습니다.


6
첫 번째 인수 (실시간)는 표준 라이브러리의 STL 부분에만 국한되지 않습니다. sprintf종종 메모리도 할당합니다. 실시간 플랫폼에서 표준 라이브러리 기능에도 결정적인 한계가 있습니다. 따라서 실시간 C ++ 구현이 어려워집니다. 전체 C ++ 표준 라이브러리를 신중하게 개발해야합니다.이 라이브러리는 작은 C 표준 라이브러리보다 더 많은 작업입니다.
MSalters

@MSalters : 물론, 실시간 요구 사항에는 많은 것들을 사용할 수 없습니다. 예외와 같은 일부 언어 기능조차도 할 수 없습니다. 여전히 C ++은 성능과 정밀한 제어 기능을 강력한 보호 장치와 결합 할 수 있기 때문에 이러한 시스템에 적합한 언어입니다 (RAII가 가장 중요한 기능입니다).
Jan Hudec

@JanHudec : 사실, STL 부분은 C ++의 "호스트 된"구현에만 필요합니다.
MSalters

7

나는 STL을 사용하고 있으며 이미 몇 년 동안 부스트했습니다. 이를 포기하고 사용자 지정 도구를 사용하려는 경우 동기는 다음과 같습니다.

  1. 컴파일 시간 단축 (75 %) iostream 만 포함하면 모듈에 백만 줄의 코드를 추가 할 수 있습니다. 예, 미리 컴파일 된 헤더는 많은 도움이되지만 여전히 큰 프로젝트에서는 컴파일 속도가 느려집니다. 장기적으로는 작업하는 사람이 많은 시간을 낭비합니다.
  2. 공연. (25 %) STL은 일반적으로 작동하도록 작성되었지만 원하는대로 정확하게 작동하도록 구조를 최적화 할 수 있습니다. 예를 들어 수백만 개의 짧은 문자열이있는 데이터 구조가있을 수 있습니다. boost :: small_vector (데이터의 작은 정적 로컬 벡터, 큰 문자열에 대해서만 동적 할당)를 기반으로 사용자 지정 문자열 클래스를 사용하는 것이 훨씬 빠를 수 있습니다. 이러한 종류의 변경으로 인해 중요한 코드 섹션이 여러 번 더 빠르게 작동 할 수 있습니다.

1
SSO는 이미 일반적입니다.
중복 제거기

후손을 위해 : SSO-> 작은 문자열 최적화, 즉 대부분의 (모두?) std :: string 구현은 스택에 작은 문자열을 유지하고 필요한 경우 힙으로 전환합니다.
파란색

컴파일 시간은 큰 것입니다
user1754322

4

C ++ 표준 템플릿 라이브러리를 사용하지 않는 한 가지 큰 이유가 있습니다. 대상 플랫폼 중 하나에 완전히 호환되는 구현이 없거나 전혀 구현되지 않았으며 하나를 얻지 못할 것이라는 것을 알고 있습니다. 다음 몇 년 안에.


3
일명 "필요하지 않을 때는 사용하지 마십시오". :)
Xeo

4
C ++ 03 표준 라이브러리는 ANSI C89 라이브러리의 측면에서만 구현되도록 설계되었으므로 적어도 STLPort를 얻을 수없는 플랫폼이 있습니까?
Jan Hudec

@ JanHudec STL이없는 플랫폼이 있다고 생각합니다. 왜냐하면 모든 것을 처리하기에 충분한 메모리가 없기 때문입니다. 일반적으로 다른 C ++ 기능 (예 : 예외)도 누락되었습니다.
Sulthan

2
@Sulthan : 마이크로 컨트롤러의 경우는 이해하지만 일반적으로 "하드 실시간"범주에 해당합니다. STL은 일반적으로 수작업 코드와 마찬가지로 메모리와 성능면에서 모두 효율적이기 때문에 다른 사전 계획은 대부분 선입견입니다. 많은 인라이닝으로 인해 이진이 커질 수 있지만 일부 성능 비용으로 수작업으로 만든 솔루션도 신중하게 구현하면 피할 수 있습니다. 누락 된 예외도 예외 ABI를 정의하고 구현하기 위해 노력하기 때문에 선입견 또는 게으름입니다.
Jan Hudec

4

나는 복잡성 (구현 효율)에 대해서는 알지 못하지만 표준 컨테이너 대신 Qt 컨테이너와 문자열을 광범위하게 사용하고 있으며 잘 작동합니다. 또한 세트 및 목록의 Qt 구현이 더 사용하기 쉽다는 것을 알았습니다.

따라서 필요에 맞는 다른 라이브러리를 사용할 수 있다면 STL을 포기하는 것이 실용적 일 수 있습니다.


2
Qt 등가물은 a) 이용 가능하거나 b) 어떤 STL 구현도 없었을 때 거슬러 올라갑니다. 그것이 여전히 사용되는 유일한 이유이며 오늘날의 STL에 반대하는 것은 아닙니다.
gbjbaanb

1
@Giorgio : 문제는 복잡한 라이브러리에서 여러 라이브러리를 결합하는 데 있습니다. 표준 인 STL 컨테이너는 링구아 프랑카를 형성 합니다 . 보다 정확하게는 그것이 그들의 관습입니다. 가장 잘 알려진 예는 Boost입니다. STL 컨테이너에서 작동 할 수 있습니다. 또한 Qt 컨테이너에서도 작동 할 수 있지만 Qt는 STL 규칙을 준수해야합니다 (예QList<T>::iterator
MSalters

3
나는 그것을 하향 투표하지 않았지만 한 가지 이유가 있습니다. 그것은 질문에 대답하지 않습니다. STL 대신 사용해야 할 것이 있지만 STL을 피할 이유는 아닙니다. STL을 피하는 이유 외에도 Qt, MFC 및 기타 라이브러리에도 적용됩니다.
Jan Hudec

3
@NoOne : 뱀 케이스가 아닌 낙타에 익숙하지만 후자를 더 나쁘게 만들지는 않습니다. 그리고 당신이 비판하는 세 가지 함수 이름 중 첫 번째는 c- 문자열과 관련이있는 사람에게는 완벽하게 묘사 적이며 다른 두 가지는 C에서 상속되며 그에 대해서는 논의하지 않습니다.
중복 제거기

1
@NoOne : 내가 말했듯이, 나는 당신이 CamelCase에 더 편안하다는 것을 완전히 얻습니다.
중복 제거기

3

Patrick은 STL 전체를 사용하지 않는 이유, 즉 플랫폼에없는 이유를 언급 했습니다.

대체로 질문에 요점이 없다고 생각합니다. 그것은 대부분 또는 전혀 결정이 아니라 선택과 선택 중 하나입니다. 컨테이너와 알고리즘을 사용하기로 결정할 수도 있지만 Std Lib 외부에서 문자열 및 i / o에 무언가를 사용하기로 결정할 수 있습니다.


3

그렇게해야 할 이유가 없다면 실용적이지 않습니다. 내가 생각할 수있는 그런 이유 중 일부는 STL (또는 표준 라이브러리의 다른 부분) 또는 부분적으로 구현이 부족하거나 리소스 제한 (메모리, CPU 속도, 스토리지 등)을 포함합니다. 달성해야 할 것을 고수하는 자신의 도구를 굴립니다.

게임 산업에서 대부분 (더 작은 규모까지) 스튜디오는 내부 라이브러리와 대상 플랫폼에 맞게 조정 된 많은 표준 라이브러리 파트의 구현을 가지고 있으며 경우에 따라 영어 또는 게임 자체를 대상으로합니다. 콘솔 게임을 개발할 때 하드웨어는 오늘날의 표준에 따라 매우 제한됩니다. 한 가지 이유 때문에 수천 줄의 수공 조립품이 있습니다. 코드에서 모든 종류의 리소스 풋 프린트를 최소화하여 게임이 더 빨리 실행되도록하여 게임 세계 (또는 더 큰 세계)에서 더 많은 콘텐츠를 허용함으로써 더 나은 제품을 만들 수 있도록하는 것이 매우 중요합니다.

"모든 성공적인 게임은 자신 만의 링크 된 목록 구현을 시작함으로써 시작됩니다."


1
모든 성공적인 게임은 표준 라이브러리를 사용하여 코드를 작성하고 게임이 광범위하게 프로파일 링 된 후에 만 ​​코드를 최적화하는 것으로 시작한다고 생각합니다. 최적화가 필요한 사항을 나타내는 데이터를 프로파일 링하기 전에 최적화하는 것은 의미가 없습니다.
Cromulent

진실. 마지막 구절은 C ++이 널리 배포되지 않았고 어셈블리 + C가 갈 길이었던 90 년대 초반의 "고대"게임 작성 방식에 대한 연극이었습니다. 아마도 나는 그것을 더 분명하게 만들어야했을 것입니다. 콘솔의 게임 산업에 잘 적용되지만 대부분의 알고리즘과 데이터 구조는 기본적으로 수작업으로 작성되므로 모든 바이트 및 사이클 수 (예 : 유지 보수성 / 이식성 / 기타)를 희생합니다.
zxcdw

2
그것은 오래된 경험이 더 많다고 말해야합니다. 최신 옵티마이 저는 일반적으로 프로그래머가 직접 수행하는 것보다 간단한 유지 관리 가능한 코드로 더 나은 어셈블리를 생성하며 STL 또는 Boost와 같은 일반 템플릿은 수작업으로 모든 것을 특별하게 처리하는 것만 큼 효율적인 코드로 인라인하는 경우가 많습니다. 그러나 그 당시에는 그렇지 않았을 때 시작된 코드가 많았으며 그 당시 거래를 배워 더 이상 이해가되지 않는 방식으로 일을 계속하는 많은 사람들이있었습니다.
Jan Hudec

2
@JanHudec 문제는 구현 (그리고 행동도 사실)이 작업에 매우 적합해야한다는 것입니다. 당신은 단순히 여기저기서 수십 바이트를 절약 할 수 없으며 (지역의 참조를 망치고) 입력을 검증하기 위해 몇 가지 브랜치를 드롭하고 (분기 오판 및 명령 캐시 누락) 컴파일러가 데이터 구조를 벡터화하는 방법을 알고 있다고 가정합니다. SIMD를 최대한 활용하려면 (적어도 시도하지 않거나 적어도 시도한 것이 올바른지 확인해야합니다). 물론 PC에서 실시간 소프트웨어를 작성하는 것은 엄격하지는 않지만 항상 더 빠른 CPU를 사용할 수 있습니다. 콘솔에 없습니다.
zxcdw
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.