목록C++ (25)
Creative Motive
출처 : 김경진님의 데브피아 (https://blog.naver.com/devmachine/220148995993) std::min, std::max 함수를 사용하다보면... 두 오브젝트 간의 최소값, 최대값을 구하는 함수인 min, max 함수는 이미 C++ 표준에 포함되어 있고, 표준 min, max 함수가 없던 시절에도 #define MIN(x, y) ((x) int x = 10, y = 20, z = 30;int min_number = std::min(std::min(x, y), z); 물론 위와 같은 방법 외에 다른 방법이 없는 것은 아닙니다. C++ 표준에서는 std::min_element, std::max_element 함수를 제공하기 때문에 컨테이너에 담겨있는 여러 개의 오브젝트들의 최..

출처 : 김경진님의 데브피아 (https://blog.naver.com/devmachine/220132178688) 오차 허용 범위 내에서 비교하기 - 상대 범위 사용 이번에 살펴볼 방법은 오차 허용 범위를 절대 범위로 사용하지 않고 상대 범위를 사용하여 비교하는 방법입니다. 여기서 상대 범위는 두 실수 값이 얼마의 비율(%)로 차이가 나는지를 의미하며, 상대 범위를 허용 가능한 오차 비율로 설정하여 비교하면 조금 더 유연하게 두 실수 값을 비교할 수 있습니다. int CompareDoubleRelative(double x, double y, double relTolerance = DBL_EPSILON){ double diff = x - y; double lagest = max(fabs(..

출처 : 김경진님의 데브피아 (https://blog.naver.com/devmachine/220119534107) ※ C/C++ 에서 사용하는 부동소수점 형식인 double 타입을 비교할 때에는 오차 허용 범위 내에서 비교해야 하는 것이 상식입니다. 하지만 가끔은 이를 망각한 채 코드를 작성하여 치명적인 버그를 생산해내기도 하죠. 이번엔 이러한 실수를 피하기 위해서 어떠한 방식으로 double 타입을 비교해야 하는지 알아보도록 하겠습니다. 원래는 float 타입을 포함하여 글을 작성하였었는데, 유효 자릿수가 7자리밖에 되지 않는 float 타입에서 오차 허용 범위를 논하는 것은 어불성설인 것 같아서 제외하였습니다. double 타입의 비교 연산시 발생하는 미묘한 오차 먼저 두 개의 double 타입 ..
출처 : 김경진님의 데브피아 ( https://blog.naver.com/devmachine/207239711 ) ※ 대부분의 C++ 개발자들은 new 연산자에 대한 올바른 예외 처리를 하고있지만, 아직까지 잘못된 방법을 사용하시는 분들도 종종 있는것 같아서 간단하게 정리해서 올려봅니다. new 연산자의 예외 처리에 대한 오해 얼마전에 누군가가 작성한 소스에 다음과 같은 코드가 포함되어 있는 것을 발견하였습니다. 약 100MB 정도의 메모리를 할당한 다음 메모리 할당에 실패하였을 경우, 이에 대한 예외 처리를 하는 코드였죠. char* ptr;ptr = new char[100 * 1024 * 1024];if (!ptr){ ...} 얼핏 보면 이 코드는 전혀 문제가 없어보이지만, 사실 아주 큰 ..
데브피아 김경진 님 작성 (https://blog.naver.com/devmachine/186444629) 8. 작업 취소와 예외 처리가 객체 소멸에 미치는 영향을 이해할것 부모 Task 그룹과 자식 Task 그룹으로 구성된 병렬 작업 트리에서 부모 Task 그룹이 취소되면 자식 Task 그룹도 취소되어 더이상 실행되지 않는다는 특징을 가지고 있습니다. 이러한 메카니즘은 필요없는 연산을 수행하지 않도록 해주고 매끄럽게 병렬 작업 트리를 중단하는데 도움이 되지만, 만약 자식 Task가 리소스를 해제하는 등의 중요한 작업을 담당하고 있다면 문제가 발생하게 됩니다. 지금부터 설명할 예제에서는 리소스를 의미하는 Resource 클래스와 이 리소스를 담는 컨테이너 역할을 하는 Container 클래스를 선언하..

데브피아 김경진 님 작성 (https://blog.naver.com/devmachine/186321804) 5. 병렬 루프를 빠져나오려면 Cancellation 또는 Exception 을 이용할것 PPL에서 Task 그룹 또는 병렬 알고리즘의 작업을 취소하기 위한 방법에는 크게 두가지가 있습니다. 한가지 방법은 Cancellation 메카니즘을 이용하는 것이고 다른 방법은 Exception 핸들링을 이용하는 것으로 이는 앞서 설명된 12장 강좌 에서 모두 설명되었던 내용입니다. 병렬 작업 트리를 취소할 때에는 취소 상태를 부모로부터 자식들에게 전파되는 하향식 방법인 Cancellation 메카니즘을 이용하여 구현하면 효율적으로 작업을 취소할 수 있습니다. 아울러 parallel_for와 같은 병렬 알고..
데브피아 김경진님 작성 (https://blog.naver.com/devmachine/186021205) 1. 작업량이 작은 루프는 병렬 처리하지 말것 PPL을 이용한 병렬 처리는 리소스를 최대한 활용하여 작업을 빠르게 처리할 수 있다는 장점을 가지고 있지만 이에 따른 스케줄링 오버헤드도 발생합니다. 만약 병렬 루프 안에서 작은 양의 작업을 수행할 경우에는 스케줄링 오버헤드가 병렬 처리로 얻는 이득보다 커지는 상황이 발생할 수 있습니다. 지금 설명하고 있는 '작업량이 작은 루프'는 루프 안에서 처리하는 내용의 크기를 얘기하는 것이지 루프의 반복 횟수를 얘기하는 것이 아니라는 것을 유념하시기 바랍니다. 그럼 이에 관한 예제를 살펴보도록 하죠. #include ppl.h>#include iostream>us..
데브피아 김경진 님 작성 (https://blog.naver.com/devmachine/185000684) 병렬 알고리즘 취소 parallel_for 와 같은 병렬 알고리즘을 사용할 때 for 루프에서 break 를 사용하여 루프를 중단하고 빠져나오는 것처럼 자연스럽게 작업을 취소하려면 어떻게 해야할까요? 만약 우리가 병렬 작업의 취소 방법에 대해 모르고 있었다면 다음과 같은 방법으로 구현해 볼 수 있을겁니다. #include ppl.h>using namespace concurrency;int wmain(){ // 취소 플래그 bool canceled = false; parallel_for(0, 100, [&](int i) { // i 값이 50일 경우 취소 플래그 설..