반응형

프로그래밍 14

[C++] GSL:Guidelines Support library (2nd)

GSL.owner:Ownership pointers ● unique_ptr //unique ownership: std::unique_ptr ● shared_ptr //shared ownership: std::shared_ptr (a counted pointer) ● stack_array //스택 할당 배열. elements의 수는 생성자에서 결정되고 그 후에 고정된다. elements들은 T가 const type이 아니면 변경될 수 있다. ● dyn_array // 힙 할당 배열. elements의 수는 생성자에서 결정되고 그 후에 고정된다. elements들은 T가 const type이 아니면 변경될 수 있다. 기본적으로 elements를 할당하고 소유하는 span. GSL.assert: Asserti..

프로그래밍 2020.12.11

[C++] GSL:Guidelines Support library (1st)

[C++] GSL:Guidelines Support library GSL은 이러한 일련의 지침을 지원하기 위해 고안된 facilities의 작은 library이다. 이러한 facilities들이 없다면, 이 guidelines은 programming language detail들에 훨씬 더 제한적일 것이다. Core Guidelines support library는 namespace 'gsl'에 정의되며, 이름은 standard library 또는 기타 잘 알려진 library 이름에 대한 별칭(aliases)일 수 있다. 'gsl' namespace를 통해 (compile time) indirection으로 사용하면 experimentation과 지원 facilities의 local variants이 ..

프로그래밍 2020.12.10

[C++] Philosophy 11, 12 & 13

[C++] Philosophy 11 : Encapsulate messy constructs, rather than spreading through the code Reason 지저분한 코드는 버그를 숨기고 유지 보수하기 더 어렵다. 좋은 interface는 사용하기 쉽고 안전하다. 지저분하고 낮은 수준의 코드는 또 다른 지저분한 코드를 더 많이 만들어 낸다. Example 이것은 low-level이고 verbose(장황하며) error-prone(오류가 발생하기 쉽다). 예를 들어, 우리는 memory exhaustion(기억력 소진)을 테스트하기 위해 "잊어버렸다". 대신 vector를 사용할 수 있다. Note standard library와 GSL은 이 철학의 예들이다. 예를 들어 vector, s..

프로그래밍 2020.12.04

[C++] Philosophy 9 & 10

[C++] Philosophy 9 : Don't waste time or space Reason 이건 C++이다. Note 목표 달성을 위해 잘 쓰는 시간과 공간(예: 개발 속도, 자원 안전성 또는 테스트의 단순화)은 낭비되지 않는다. "효율성을 위해 노력하는 또 다른 이점은 프로세스가 문제를 더 깊이 이해하도록 강요한다는 것이다." - 알렉스 스테파노프 Example, bad 그래, 이건 caricature다. 하지만 우리는 production 코드에서 개인의 실수나 더 나쁜 것들을 봐왔다. X의 레이아웃은 최소 6 bytes(그리고 대부분의 경우 더 많이)가 낭비된다는 것을 보장한다는 점에 유의한다. 복사 작업의 거짓 정의는 이동 semantic을 비활성화하여 반환 작업이 느리게 한다(Return V..

프로그래밍 2020.12.03

[C++] Philosophy 7 & 8

[C++] Philosophy 7: Catch run-time errors early Reason "mysterious" crash들을 피하십시오. (아마도 인식할 수 없는) 잘못된 결과들을 초래하는 error들을 방지하십시오. Example 여기 use1 함수에서 우리는 데이터 손상이나 crash로 이어질 작은 사용 오류를 만들었다. (pointer, count) 스타일의 인터페이스는 '범위 밖의 오류'로부터 자신을 방어할 수 있는 현실적인 방법이 없는 increment1() 함수를 남긴다. 우리가 subscripts가 범위를 벗어났는지 확인할 수 있었다면, p[10]에 액세스해서야 오류가 발견는 일은 없었을 것이다. 우리는 더 일찍 확인하고 코드를 개선할 수 있었다. m

프로그래밍 2020.12.02

[C++] Philosophy 5 & 6

[C++] Philosophy 5: Prefer compile-time checking to run-time checking Reason 코드의 명확성과 성능. compile time에 발견된 error들에 대해서는 error handler를 사용할 필요가 없다. Example 이 예는 (overflow가 정의되지 않았기 때문에) 목표를 달성하지 못하며, 간단한 static_assert로 대체해야 한다. 아니면 여전히 type system을 사용하고 Int를 int32_t type로 변경하는 것이 좋다. Example 보다 아래가 좋다 Alternative formulation Compile time에 잘 할 수 있는 것들을 run time으로 미루지 말자. Enforcement ● pointer의 ar..

프로그래밍 2020.12.01

[C++] Philosophy 3 & 4

[C++] Philosophy 3 : Express intent Reason (이름이나 주석 처럼) 일부 코드의 의도가 명시되지 않는 한, 코드가 해야할 일을 하고 있는 지 여부를 알 수 없다. Example v의 element들을 반복하는 의도는 분명하게 나타나지 않는다. index의 구현 세부사항이 (오용될 수 있도록) 노출되었고, i 변수는 (의도되었건 의도되지 않았건) 루프의 범위를 초과해서 남아 있다. Code를 읽는 사람은 코드의 이 부분만 봐서는 알 수가 없다. Better: 이제 반복 메커니즘에 대한 명시적인 언급은 없으며, 루프는 우발적인 변경이 일어나지 않도록 상수(const) 요소에 대한 reference로 작동한다. 만약 element들에 대한 수정이 필요한 경우 다음과 같이 작성한..

프로그래밍 2020.11.30

[C++] Philosophy 1 & 2

[C++] Philosophy 1: Express ideas directly in code Reason Compiler 는 주석(또는 design 문서)을 읽지 않는다. 많은 프로그래머도 마찬가지다. code에서 표현되는 것들은 의미론적으로 정의했고 Compiler들과 다른 tool들에 의해 체크될 것이다. Example month의 첫 번째 선언은 Month을 반환하고 Date object의 상태를 수정하지 않는 것에 대해 명시적이다. 두 번째 버전은 독자들이 추측하게 하고, 잡히지 않는 bugs가 발생할 가능성을 더 많이 열어준다. Example,bad 이 loop는 축약된 std::find 함수 이다. Example, good 훨씬더 명확한 표현은 아래와 같다. 잘 설계된 library는 언어적 특..

프로그래밍 2020.11.29

[C++] shared_ptr, weak_ptr

shared_ptr shared_ptr 은 여러 파티에서 공통으로 사용하는 memory를 관리한다. 유일하게 객체를 소유하는 unique_ptr과는 다르게, shared_ptr이 객체를 가리킬 때, 다른 shared_ptr도 그 객체를 가리킬 수 있다. shared_ptr 이 더 이상 data를 참조하지 안흔 즉시 memory를 자동으로 해제한다. 모든 thread가 thread에 대한 접근이 끝나면 메모리를 자동으로 해제 한다. 가능하다면 make_shared를 사용해서 shared_ptr을 만들어야 한다. memory와 함께 관리 및 Business data를 저장하며 memory 캐싱이 보다 효율적이다. 여기서 use_count()는 몇 개의 shared_ptr이 원래 객체를 가리키고 있는지를 알아..

프로그래밍 2020.10.18

[C++] unique_ptr

unique_ptr 사용에 관한 간단한 예제입니다. 'unique_ptr'이라는 이 포인터의 이름은 참조한 data의 고유한 소유권(Unique Ownership)을 의미합니다. raw pointer에서 unique_ptr의 data를 가져오고 싶다면 멤버 함수 get()을 사용하면 됩니다. raw pointer와 비교할 때 unique_ptr은 가장 큰 장점을 할당한 memory를 소멸자에서 자동으로 해제해 준다는 것입니다. 그로인해 실수로 인한 memory leak을 방지해 줄 수 있습니다. 이 특성으로 인해 unique_ptr에 동적으로 할당하지 않은 주소를 할당할 경우, VS2015에서 실행 시 run time error가 발생한다. unique_ptr에는 동적으로 할당한 주소만 assign 가능..

프로그래밍 2020.10.17
반응형