“팀 전체”C ++ 기능?


16

C ++에서 예외와 같은 기능은 전체 프로그램에 영향을 미칩니다. 전체 프로그램 에서이를 비활성화 하거나 코드 전체에서 처리해야합니다. C ++ Report유명한 기사는 다음과 같습니다.

직관적으로 코딩 예외의 어려운 부분은 명시적인 던지기와 잡기가 아닙니다. 예외를 사용하는 것의 가장 어려운 부분은 임의의 예외가 발생 지점에서 처리기로 전파되어 안전하게 도착하고 프로그램의 다른 부분을 손상시키지 않으면 서 모든 개입 코드를 작성하는 것입니다.

new예외를 던지기 도하므로 전체 프로젝트에서 예외를 모두 비활성화하지 않는 한 예외를 발생 시키지 않는 함수 만 호출하지 않는 한 모든 함수는 기본 예외 안전 을 제공해야합니다 .

따라서 예외는 "전체 프로그램"또는 "전체 팀"기능입니다. 이는 팀을 사용하는 모든 사람이 이해해야하기 때문입니다. 그러나 내가 아는 한 모든 C ++ 기능이 그런 것은 아닙니다.

가능한 예제는 템플릿을 얻지 못했지만 사용하지 않는 경우에도 여전히 올바른 C ++를 작성할 수 있습니다. 그렇지 않습니까? 심지어 sort정수 배열을 호출 하고 놀라운 속도 이점을 누릴 수 있습니다. qsort버그의 위험이없는 C (함수 포인터가 호출되지 않기 때문에) 템플릿이 "전체 팀"이 아닌 것 같습니다.

코드를 직접 사용하지 않고 "전체 팀"인 다른 C ++ 기능이 있습니까? 특히 C에없는 기능에 관심이 있습니다.

업데이트 : 특히 알아야 할 언어 적용 신호가없는 기능을 찾고 있습니다. 첫 번째 답변은 전체 팀이기도 한 const-correctness를 언급했기 때문에 모든 사람이 그것에 대해 배워야합니다. 그러나 AFAICS는로 표시된 함수를 호출하는 경우에만 영향을 미치며 const컴파일러는 상수가 아닌 객체에서 호출하지 못하게하므로 Google에 무언가를 얻습니다. 예외적으로, 당신은 그것을 얻지 못합니다. 또한 사용하는 즉시 항상 사용 new되므로 예외는 더 "보이지 않는"것입니다. 나는 이것을 객관적으로 표현할 수 없기 때문에 전체 팀 기능을 높이 평가할 것입니다.

업데이트 2 : C ++ 기능 대신 많은 양의 주류 프로그래밍 언어에 적용되는 멀티 스레딩과 같은 것을 제외하기 위해 "C ++ 관련 기능"과 같은 것을 작성해야합니다.

부록 : 왜이 ​​질문이 객관적인지 궁금하다면

C ++은 복잡한 언어이므로 많은 프로젝트 또는 코딩 가이드가 "간단한"C ++ 기능을 선택하려고 시도하고 많은 사람들이 대부분 주관적인 기준에 따라 일부 기능을 포함하거나 제외하려고합니다. 이에 대한 질문은 SO에서 정기적으로 정당하게 종결됩니다.

대신, 나는 "전체 팀"언어 기능이 무엇인지 (정확하게) 정확하게 정의하고 C ++에 관한 문헌에서 광범위한지지 증거와 함께 예제 (예외)를 제공하고 C ++에서 전체 팀 기능을 요구합니다. 예외를 넘어.

"팀 전체"기능을 사용해야하는지 또는 관련 개념인지 여부는 주관적 일 수 있지만 이는 항상이 질문의 중요성이 주관적임을 의미합니다.

답변:


11

'전체 팀'기능으로 동시성을 지정합니다.

비록 몇 명의 전문가 만이 동시성 문제를 알고 있어야하며, 팀의 나머지 부분 (템플릿으로 할 수있는 것처럼)에 대해 걱정하지 않고 혜택을 얻을 수 있도록 소프트웨어를 설계 할 수 있지만 실제로는 그렇게합니다. 그런 식으로 작동하지 않습니다. 실제로, 다중 스레드가있는 경우, 사용에 잠재적 인 동시성 문제가있는 경우 사용하는 모든 변수에 대해 신중하게 분석해야합니다.


스레드는 C ++에 국한되지는 않지만 전체 팀 기능이라는 데 동의합니다. 그러나 대부분 다른 언어로 동시성 (스레드 기반이 아닌)에 대한 다른 인터페이스가 있으며, 일부 인터페이스는 동시성이 훨씬 더 잘 캡슐화 될 수 있도록합니다 (프로그래밍 언어의 현재 연구 주제 임). 따라서 이것이 동시성에 적용되는지 여부는 공개적인 질문입니다.
Blaisorblade

@Blaisorblade-C ++ 11은 자체 스레딩 라이브러리를 도입했습니다. 그래서 C ++의 일부입니다.
Michael Kohne

@ MichaelKohne : C ++이 멀티 스레딩을 지원하지 않는다고 주장하지 않았습니다. 다른 많은 언어가 스레드를 가지고 있기 때문에 스레드는 C ++에 국한되지 않습니다. 방금 설명한 문제가 동시성 인터페이스로 스레드에 적용된다는 점에 주목했습니다.
Blaisorblade

"핵심 조건"이이 핵심 문제에 대해 더 나은 단어라고 말할 것입니다. 즉, 프로그래머는 동시성 프레임 워크에서 작업하거나 전혀 사용할 필요가 없지만 C ++ 코드를 작성하고 둘 이상의 스레드에서 코드를 호출 할 수 있으면 일반적으로 경쟁 조건에 대해 생각해야합니다. 작성된 모든 코드에서.
rwong

그것은 몇 년 전에 일했던 동료와의 의사 소통을 상기시킵니다. 동료가 다른 동료에게 물었습니다.이 기능은 스레드 안전합니까? 다른 동료가 대답했습니다. 그런 다음 요청한 동료는 여러 스레드에서 계속 사용하여 예기치 않은 결과를 얻었습니다 (충돌하지는 않았지만 동일한 작업에 여러 작업이 적용되었습니다). 요청한 동료는 "스레드 안전"의 의미에 대한 정신적 모델이 없었으며 "내가 원하는 모든 것을 할 수 있습니다"라는 응답을 착각했습니다.
rwong

10

명백한 대답은 const정확성입니다. const/ volatile자격은 전염성이 있기 때문에 코드의 한 부분이 코드를 사용하기 시작하면 모든 (직접 또는 간접적으로) 호출 코드도 const정확 해야합니다 const.

그러나 예외와 마찬가지로 이것은 궁극적으로 좋은 일 입니다. 더욱이 예외 안전과 달리 컴파일러에 의해 엄격하게 검증됩니다.


2
또한 const-correctness는 투명합니다. 함수에 제공하는 유형 (항상 표시 가능)에 관한 것이므로 컴파일러가 잘못하면 소리를 지 릅니다. 나는 너무 불투명 한 것을 생각하고 있었는데, 너무 늦을 때까지 무언가 잘못되었다는 것을 전혀 알지 못합니다 (그런데도 알아 내기가 어려울 것입니다). 그러나 귀하의 답변은 어쨌든 흥미 롭습니다.
Blaisorblade

10

포인터.

  • 포인터가 스택의 메모리를 가리 킵니까?
  • 포인터가 힙의 메모리를 가리 킵니까?
  • 포인터가 단일 객체를 가리 킵니까?
  • 포인터가 배열을 가리 킵니까?
  • 포인터가 배열 중간의 위치를 ​​가리 킵니까?
  • 포인터가 유효합니까?
  • 포인터가 엉망입니까?
  • 어떤 코드가 포인터를 "소유"합니까?
  • 참조 된 객체를 수동으로 할당 해제해야합니까? 그렇다면 어떻게?

1
포인터 소유권에 대한 질문으로 인해 +1이 있습니다. 스마트 포인터가 없으면 소유권은 실제로 전체 팀에 전파됩니다.
JKor

3

또 다른 가능성은 운영자 과부하입니다. 코드베이스의 한 부분이 오버로드 된 연산자로 땜질되기 시작하면 모든 사람들이 작업하는 주어진 객체가 실제로 무엇을하고 있는지 정확히 추측하는 경향이 있습니다. 예외 및 const 정확성과 같은 방식으로 코드베이스를 통해 명시 적으로 전파되지는 않지만 팀 전체가 언제, 어떻게, 왜 사용하는지에 대해 같은 페이지에 있지 않으면 문제가 발생할 수 있습니다.


1

const 정확성 외에 (위에서 본) 유일하게 유일하게 스트림 (ing) 상태입니다. 객체와 하위 객체를 사용하는 C ++ 코드를 작성하고 객체 계층 구조 기회가 발생하면 결국 프로그램 운영자와 데이터를주고받을 수 있습니다. 당신은 수있는 간단한 스트리밍 작업 쓰기 됩니다 컴파일 합니다 의미 정확을 ...

std::ostream& operator<< (std::ostream&, MyClass const&) {...}
std::istream& operator>> (std::istream&, MyClass&) {...}

...하지만 일단 작성하면 클라이언트가 보내는 것과 동일한 형식을 사용한다는 것을 절대 보장 할 수 없습니다. 스트림과 관련하여 너무 많은 이상한 경우가 있습니다. 함수 호출 체인 아래로 스트림이나 스트림 플래그를 인수로 전달 해야하는 경우 더 나쁩니다. 이는 클래스 스트리밍이 일반적으로 구현되는 것입니다. 따라서 스트리밍은 위의 용어를 사용했을 때 " 보이지 않는 "또는 "바이러스 성"으로 정의 될 수 있습니다 ( const-correctness와 같은 수준은 아니지만 ).

멤버가 클래스 계층 아래에있는 string? 놀랍게도 클라이언트는 단어 또는 다른 단어를 보내는 것이 좋습니다 . 직렬화하려는 숫자가 있습니까? 함수 호출 전에 자신의 스트림을 8 진 출력으로 설정 한 바보가 누구인지 모르기 때문에 모든 함수 호출 깊이 에서 스트림 플래그를 확인, 저장 및 복원하는 것이 좋습니다 . 또는 더 나쁜 - 단지 같은라는 사람 setfillsetw따라서 귀하의 첫 번째 - 그리고의 서식 입력 / 출력을 아프게 하는 상태가 때문에 1 세대 통합 회원 전파되지 않습니다 . 아 스트림과 국제화에 대해 묻지 않겠습니다.

당신이 올바른 방법, 또는 잘못된 방향으로 스트리밍, 또는 스트리밍되는 어떠한 언어로 경고 없다 전혀은 . 데이터 백업을 쓰기 위해 스트림에 전달할 클라이언트 코드를 요청 했습니까? 스트림이을 가리키는 지 알 수있는 방법이 없습니다 /dev/null. ( 반면에, 당신 놀라운 백업 속도와 압축률을 그렇게 주장 할 수 있습니다 ! )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.