예, 사용됩니다. 네트워크 패킷 처리 분야에서 일합니다. 네트워크 패킷을 처리하는 두 개의 다른 회사에있었습니다. 따라서 우리는 TCP 이상의 레벨이 아닌 이더넷 또는 IP 레벨에서 작동하고 있습니다.
흥미롭게도 두 회사 모두 C는 C ++보다 선택되었습니다. 한 회사에서 두 제품 중 하나는 Linux 커널 위에 구축 된 반면 다른 제품은 Linux 사용자 공간에 구축되었습니다. Linux 커널은 C로 프로그래밍되어 커널 제품은 C를 사용했지만 사용자 공간 제품에도 C를 사용하기로 결정했습니다. 두 제품 모두 약 2000 년부터 시작되었습니다 (2000 년 이전의 커널 제품과 2000 년 이후의 사용자 공간 제품).
내가 그 뒤에 갔던 회사에서 제품은 C ++이 아닌 C로 빌드되었습니다. 실제로는 1990 년대 중반부터 진행된 프로젝트이지만 최근의 성능 개선 요구로 인해 본질적으로 모든 것이 다시 작성 될 것으로 결정되었습니다. 이 재 작성으로 인해 C ++을 선택하는 옵션이 있었지만 그렇게하지 않았습니다.
네트워크 패킷 처리 분야에서는 성능이 중요합니다. 따라서 기존 해시 테이블보다 성능이 높은 자체 해시 테이블을 구현하고 싶습니다. 해시 테이블 작성자가 아니라 사용할 해시 함수를 선택하는 사람입니다. 아마도 성능을 원하고 MurMurHash3을 선택하십시오 . 아마도 나는 보안을 원하고 SipHash로 간다 . 메모리 할당자는 분명히 커스텀입니다. 실제로, 우리가 사용하는 모든 중요한 데이터 구조는 최상의 성능을 위해 맞춤형으로 구현되었습니다.
C ++의 사용을 방해하는 것은 없지만 일반적으로 나쁜 생각입니다. 패킷 당 하나의 예외가 발생하면 패킷 처리 속도가 허용 할 수없는 수준으로 떨어집니다! 따라서 C ++의 예외를 사용할 수 없습니다. 너무 느려 데이터 구조를 구조체로 구현 한 다음 해당 구조체에서 작동하는 함수를 구현하여 일종의 객체 지향 C 코드를 이미 사용하고 있습니다. C ++은 가상 함수를 허용하지만 가상 함수 호출을 사용하면 어디서나 사용하면 성능이 저하됩니다. 따라서 가상 함수 호출이 필요한 경우 명시 적이며 함수 포인터를 갖는 것이 좋습니다.
C ++은 메모리 할당 등 많은 일을 수행합니다. 반면에 C에서는 일반적으로 발생하지 않습니다. 메모리를 할당하는 함수를 작성할 수 있지만 일반적으로 함수의 인터페이스에서 할당이 발생하고 있음을 알 수 있습니다.
C로 프로그래밍 할 때 수행 할 수있는 미세 최적화 유형의 예로 Linux 커널의 container_of 매크로를 살펴보십시오. 물론 C ++ 코드에서 container_of를 사용할 수는 있지만 누가 그렇게합니까? 나는 대부분의 C 프로그램에서 완전히 수용 가능하지만 전형적인 C ++ 프로그래머는 링크 노드를 별도의 블록으로 할당하는 링크 된 목록과 같은 다른 것을 즉시 제안 할 것입니다. 할당 된 모든 메모리 블록이 성능에 좋지 않기 때문에 원하지 않습니다.
아마도 C ++에서 우리에게 도움이되는 유일한 것은 C ++이 템플릿 메타 프로그래밍을 허용한다는 것입니다. 즉, 함수 매개 변수가있는 동안 가상 함수 호출을 피하고 컴파일러가 함수를 인라인 할 수 있습니다. 그러나 템플릿 메타 프로그래밍은 복잡하므로 C의 모든 요구 사항을 충족시킬 수 있으므로 C ++에서이 기능의 이점은 그리 중요하지 않습니다.
회사 중 하나에서 실제로 일부 기능이 구현 된 사용자 지정 컴파일 된 언어가있었습니다. 컴파일러의 대상 언어는 어느 것입니까? 어셈블리? 아니요, 32 비트 및 64 비트 아키텍처를 모두 지원해야했습니다. C ++? 분명히 당신은 농담입니다. 분명히, 그것은 GCC의 계산 된 goto 와 함께 C였습니다 . 따라서 사용자 정의 언어는 C (또는 실제로 계산 된 goto를 지원하는 C의 gcc 변형)로 컴파일되었으며 C 컴파일러는 어셈블리를 생성했습니다.