분류 전체보기105 [C++ 20] 모듈 (Module) 사용하기 C++ 20 의 모듈 시스템이란 헤더 파일을 따로 만들지 않고도 cpp 파일들만 가지고 클래스들의 메타데이터 정보를 생성해 h 파일 없이도 링킹 가능하도록 만든 것입니다. 기존에는 대형 프로젝트의 경우 헤더 파일에서 한글자만 바꾸더라도 매크로 레벨의 헤더 파일 복붙 방식 O(n*n) 이라서 하위 cpp 파일까지 전부 컴파일을 다시 했어야 했는데, 이 기능 덕분에 컴파일 속도도 매우 빨라집니다. 현대적인 언어 JAVA, C# 등은 전부 이런 방식을 이미 쓰고 있는데 C 가 워낙 오래된 언어라서 그렇습니다.. 모듈 시스템은 2017년 표준에 들어온 기능임에도, 아직 TR (Test & Review) state 로 있어서 일부 컴파일러에서 기능을 활성화야 사용할 수 있습니다. 이 글에서는 Visual Stud.. 2024. 4. 15. [C++ Core Guidelines] P.7 런타임 에러는 빨리 잡자 P.7: Catch run-time errors early 이유 런타임 에러를 빨리 잡지 않으면 나중에 나비효과로 "신비한" 충돌이 발생할 수 있고 충돌의 실제 원인을 파악하기 어렵게 만듭니다. 숙련된 C++ 개발자들은 객체의 생성자에 (이른 시점에) 유효한 값으로 객체를 초기화 하고 있는지 검사하는 것을 선호하기도 합니다. 이것이 항상 바람직한 방법인지, 주의해야 할 점은 없는지 알아봅시다. 예시 (나쁜 예) void increment1(int* p, int n) // 나쁨 : 에러를 발생시키기 쉽습니다 { for (int i = 0; i < n; ++i) ++p[i]; } void use1(int m) { const int n = 10; int a[n] = {}; // ... increment1(a,.. 2024. 4. 13. [C++ Core Guidelines] P.6 컴파일 타임에 평가가 불가능한 코드는 런타임에서라도 평가되도록 하자 P.6: What cannot be checked at compile time should be checkable at run time 이유 런타임에만 감지 가능한 에러들은 보통 가끔씩만 발생하거나 감지하기가 까다로운 경우가 많습니다. 이러한 에러가 발생하도록 그냥 놔두면 프로그램 실행 중 충돌이 발생하고 나쁜 결과를 초래합니다. 알아두기 네.. 런타임에 남아 있는 모든 오류를 포착하는 것은 종종 감당하기 힘든 일입니다. 그러나 충분한 리소스(분석 프로그램, 런타임 검사, 머신 레벨 리소스, 시간)가 주어지면 원칙적으로 모든 에러를 확인할 수 있게끔 프로그램을 작성하도록 노력해야 합니다. 예시 (나쁜 예) // f() 가 별도로 컴파일되고 동적으로 로드될 수도 있는 함수라고 해봅시다 extern void.. 2024. 4. 11. [C++ Core Guidelines] P.5 가급적 컴파일 타임에 코드가 평가될 수 있도록 만들자 P.5: Prefer compile-time checking to run-time checking 이유 컴파일 타임에 에러를 미리 탐지하고 해결한다면 불필요한 시간 낭비가 줄며, 런타임에 별도의 에러 검증 로직이 돌지 않기 때문에 프로그램의 성능에도 영향을 미치지 않습니다. 예시 (나쁜 예) // 이렇게 작성하지 마세요 int bits = 0; // 1을 왼쪽으로 밀면서 오버플로우가 발생할때를 체크합니다 // 오버플로우가 발생한 순간 int 의 실제 크기를 알 수 있습니다 for (int i = 1; i; i 2024. 4. 11. [C++ Core Guidelines] P.4 가급적 컴파일 타임 타입을 사용하자 P.4: Ideally, a program should be statically type safe 이유 C++ 는 데이터 타입을 컴파일 시점에 미리 알 수 있는 statically typed language 입니다. 컴파일러가 타입 오류 (형변환 실패, 정밀도 손실 등) 를 미리 감지하도록 가급적 컴파일 타임 타입을 사용하면 프로그램의 안정성을 미리 확보할 수 있습니다. 하지만 안타깝게도 아래와 같은 요소들로 인해 컴파일 타임에 그 타입을 알기 어렵게 만듭니다. 1. unions (공용체, 같은 메모리 공간을 여러 타입으로 취급) 2. casts (단순 형변환) 3. array decay (배열이었으나 단순 포인터로 취급) 4. range errors (메모리 범위를 벗어난 접근) 5. narrowing.. 2024. 4. 7. [C++ Core Guidelines] P.2 ISO 표준 C++ 코드로 작성하자 P.2: Write in ISO Standard C++ 이유 표준 C++ 문법을 사용하면 대부분의 환경에서 정상 동작을 보장할 수 있습니다. (이식성의 향상) 알아두기 특정 환경에서 동작하는 코드를 작성하거나 (예시로 windows.h 등) 시스템 리소스를 직접 사용하기 위해 확장 문법이 꼭 필요한 경우도 있습니다. (예시로 항공기 제어 프로그램 설계를 위한 동적 메모리 할당 금지 등) 이때는 가능한 한 확장 문법의 사용을 분리 (캡슐화) 하고 다른 시스템에서 확장을 지원하지 않을 경우에 쉽게 끄고 켤 수 있도록 컴파일 환경과 인터페이스를 구축하는 것이 좋습니다. 확장 문법은 표준 문법과 다르게 동작이 엄격하게 정의되지 않은 경우가 많아서 컴파일 시스템 (환경) 에 따라 동작이 다를 수 있고 이는 이식성.. 2024. 3. 30. 이전 1 ··· 10 11 12 13 14 15 16 ··· 18 다음