C ++ Standard가 왜 표현식 템플릿을 채택하지 않았습니까?


17

1998 년 C ++ 표준 이전에 기술로서 표현 템플릿이 크게 발견되었다는 것을 이해하고 있습니다. 왜 여러 표준 클래스 std::string와 스트림 의 성능을 향상시키는 데 사용되지 않았 습니까?


@ChrisLively : 그러한 변화를 제안하는 제안서를 제출한다면, 처음으로 왜 끝나지 않았는지 모르는 것이 절대적으로 문제가 될 것입니다. 특유한.
DeadMG

문자열 속도를 높이기 위해 식 템플릿을 사용하여 정확히 무엇을 하시겠습니까?
jalf

5
@jalf :에 적용하면 반복 할당에 대한 중복 할당을 operator+달성 O(n)하고 제로화 할 수 있으며 rvalue 참조보다 여전히 빠릅니다. 또한 "비 인스턴스 인덱스"뿐만 아니라 write 에 복사하여 COW 구현과 같은 최적화를 수행 할 수도 있습니다. 식 템플릿으로 성능과 의미를 모두 향상시킬 수있는 다른 응용 프로그램도 있습니다.
DeadMG

나는이 질문이 얼마 전에 요청 된 것을 알고 있지만, 표현 템플릿이 무엇인지 및 / 또는 관련 자료에 대한 링크에 대해 자세히 설명해주십시오.
einpoklum

답변:


17

Expression Templates1995 년 6 월 Todd Veldhuizen 이 C ++ Report 잡지 의 기사에 처음 게시했습니다 . 그 당시 표준위원회는 이미 STL 을 C ++ 표준에 추가하는 데 많은 노력을 기울 였으며 , 그 자체로 1 년 또는 2 년 정도 표준을 지연시키는 작업이었습니다. (STL은 1993 년에위원회에 제출되었으며 1994 년에 공식적으로 제안되었습니다. 표준을 마치는 데 4 년이 더 걸렸습니다.)
C ++ 표준화위원회는 많은 자원 봉사자이므로 일부는 비용, 나는 C ++ 표준에 또 다른 아이디어를 추가하는 데 사용할 자원이 아무도 없다고 생각합니다.

또한 1995 년은 Veldhuizen의 기사가 출판 된 해입니다. 이 기술이 알려지고 인식 되려면 몇 년 이 더 걸렸을 것이다 . (STL에 대한 아이디어는 70 년대로 거슬러 올라가고, Ada 구현은 80 년대 후반에 이루어졌으며, C ++ 구현에 대한 작업은 1990 년경부터 시작되어 왔으며, 아이디어가 C ++ 표준화로가는 길을 찾는 데 3 년이 더 걸렸습니다. 위원회.)
가 있었다, 그러나, 표준에 대한 최종 투표까지 토드의 기사에서 3 년. 그것은 여전히 ​​새롭고 기본적으로 테스트되지 않은 아이디어를 통합하기에는 너무 적은 시간이었습니다.

또한 템플릿 메타 프로그래밍의 일종 인 Expression Templates 는 비교적 "간단한"STL보다 더 많은 방법으로 스트레스 컴파일러를 강조 합니다. 그리고 내가 기억하는 것에서, 1998 년에도 표준이 출판되었을 때 모든 STL을 컴파일 할 수있는 컴파일러는 없었습니다.
표준화위원회의 주요 목표 중 하나는 확립 된 관행 을 표준화하는 것이 었 으므로 ( 표현식을 엄격하게 고수하지는 않음) Expression Templates 는 그 당시의 안건에 없었을 것입니다.


1
그러나 std::stringiostream은 STL에 없었습니다.
R. Martinho Fernandes

@ R.MartinhoFernandes : 그렇다고위원회에 자원이 부족한 것은 아닙니다. (그리고는 std::string BTW, STL과 용기로 돌려로 변경되었습니다.)
SBI

2
나는 이것을 링크해야한다고 생각한다 : std :: string이 STL의 일부인가?
Xeo

@ sbi 아, 그게 말이됩니다.
R. Martinho Fernandes 2012

10

간단한 대답은 당신이 분명히 로비하지 않았다는 것입니다. 표현 템플릿을 포함하지 않는 나만의 의제를 가지고 있었기 때문에 나도 그랬다. 또한 특히 문자열에 대한 인터페이스는 이미 너무 많은 마스터를 제공하려고 시도하여 모든 것에 사용되며 mothing에 좋은 클래스를 만듭니다.

표준 라이브러리에는 이미 std::valarray표현식 템플릿 스타일 구현을 지원하기위한 제품군이 있습니다. 내가 알 수있는 한 그것을 잘 자르지는 않습니다. 이 문제를 일으킨 한 가지 문제점은 표준에 포함 된 반 구운 버전을 얻기 위해 로비에 참여한 사람들이 포함 된 순간부터 작동을 중단했다는 것입니다. 그것을 구출하려는 시도가 있었지만 (예 : David Vandevoorde, Matt Austern, 나는 스톡홀름 회의에서 하루 정도 일했다) 결국에는 아무도 관심이 없었습니다.


8
DeadMG는 기저귀를 간신히 키우고 "C ++"를 제대로 발음 할 수있는 지점에 도달하지 않았다는 단순한 사실 때문에 로비를 할 수 없기 때문에 약간 불공평하게 시작합니다. :)
sbi

7
유아로서 로비 활동을하지 않은 것이 정말 유감입니다. : P
DeadMG

1
모든 사람이 표준에 영향을 줄 수있는 기회는 없었다는 것을 알고 있습니다. 약 15 년 이후 정기적으로위원회 회의에 참석하지만 표준에 대한 영향은 제한적입니다. 그러나 내 요점은 : 누군가가 표준에서 무언가를 원한다면 노력해야합니다! 기술적 인 것이 든 그렇지 않든 (예 : 성장에 전적으로 집중하는) 다른 우선 순위를 가진 사람들에게는 본질적으로 존재하지 않는 것들이 있습니다.
Dietmar Kühl

valarray의 libgcc 구현은 표현식 템플릿을 기반으로합니다.
phresnel

3

현재 "표현 템플릿"으로 알려진 기술은 Todd Veldhuizen과 나 자신에 의해 적어도 1994 년까지 (독립적으로) 발견되었습니다 (Todd의 기사는 1995 년이지만 기사를 게시하는 데 약간의 시간이 소요됩니다. comp.lang.c ++에서 처음 나타났습니다).

실제로이 문제로 인해 C ++위원회 회의에 참석하기 시작했습니다. 1996 년 3 월 첫 산타 크루즈 회의에서위원회에 std :: valarray의 기술과 완벽한 재 설계를 발표했습니다. 너무 큰 변화로 여겨졌지만 Dietmar가 언급 한대로, 차기 회의에서 몇 마디를 받았습니다. std :: valarrray를 구현하기 위해 식 템플릿을 사용할 수있는 스톡홀름 놀랍게도 이러한 단어는 여전히 존재합니다. http://wg21.link/N4727 의 하위 섹션 [valarray.syn] 29.7.1의 3-6 단락을 참조하십시오 .


1
실제 URL 대신 링크 단축기를 사용하는 이유가 무엇인지 궁금해
gnat

3
@ gnat : 문서 번호를 알고 있다면 wg21.link URL을 작성하는 것이 쉽지 않습니다. 그것이 내가 여기서 한 일입니다. 문서가 릴리스 된 특정 메일 링 / 연도를 검색하지 않아도됩니다. 또한 WG21이 호스팅 URL을 이동하기로 결정하면 wg21.link가 그에 따라 업데이트되어 오래된 참조를 피하기를 바랍니다. (즉, 요점은
짧지는

0

가장 좋은 추측은 1998 년에 식 템플릿을 다시 컴파일 할 수있는 컴파일러가 없다는 것입니다.


1
Todd Veldhuizen은 1996 년 이전에 KAI의 C ++ 컴파일러를 사용하여 표현식 템플릿 작업을 수행했습니다. 그 이유는 훨씬 더 이상합니다 ...

1
C ++ 커뮤니티의 대다수는 2003 년까지 STL을 최대한 활용할 수 없었으며 (저는 Microsoft를보고 있습니다), STL을 표준에 통합하기 위해위원회를 중단하지 않았습니다.
sbi

2
실제로 bth Todd와 저는 원래 1993 년에 출시 된 Borland C ++ 4 컴파일러에서 작동하는 표현식 템플릿 기술을 사용했습니다. 또한 STL이 완전히 작동하는 최초의 컴파일러라고 생각합니다. 나중에 Expression Templates 라이브러리를 다양한 다른 컴파일러 (당시 Sun의 Cfront 기반 컴파일러 포함)로 이식했습니다. KAI C ++ 컴파일러는 조금 후에 나왔습니다.
Daveed V.

@DaveedV. BCC4는 그 당시로서는 매우 훌륭한 컴파일러였으며 당시의 VC 버전보다 훨씬 뛰어났습니다! 하지만 악명 높은 "스마일 버그"와 같은 단점이있었습니다. :->또한 빠르게 개선하지 못했기 때문에 빠르게 개선되는 템플릿 기술을 사용하기가 점점 어려워졌습니다. VC7.1이 출시되고 훨씬 더 준수했을 때, 볼랜드를 죽였습니다.
sbi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.