시작은 미미하나 끝은 쥬쥬하리라.

c++ 33

[C++] ABI와 opaque handle을 사용한 C++ ABI 호환성 유지

목차ABI응용/심화요약1. ABIABIABI(Application Binary Interface)는 실행 파일이 서로 맞물리는 바이너리 수준에서의 약속을 의미.API는 소스 코드 수준에서의 약속으로 API가 같더라도 ABI가 다르면 링크 / 호출 / 예외 전파가 실패하는 등의 문제 발생.-> dll, 플러그인 사용이 많은 산업 장비 분야에서 ABI는 품질의 핵심 축을 담당. API : 소스 레벨 인터페이스, 헤더 함수 혹은 클래스 시그니처, 맞물리지 않으면 컴파일 단게에서 에러 발생. ABI : 바이너리 레벨 인터페이스, 호출 규약 혹은 네임 맹글링, 레이아웃 등, 맞물리지 않으면 링크 또는 런타임 에러 발생. ABI 구성 요소1, Name Mangling(이름 맹글링)/* lib.c (C 컴파일) */..

[C++] 컴파일 과정과 번역 단위(TU), ODR의 관계

목차컴파일 과정응용/심화요약1. 컴파일 과정컴파일일반적으로 컴파일이라는 과정은 실제로 다음과 같은 파이프라인을 구성하고 있음.(1) 전처리 : #include, #define, 조건부 컴파일을 펼쳐서 TU(번역 단위)를 만듬.-> .i 파일 생성.(2) 컴파일 : TU를 최적화하고 경고/에러 처리를 하여 어셈블리어로 변환.-> .s 파일 생성.(3) 어셈블 : 어셈블리를 목적 파일로 변환. (섹션 / 심볼 테이블 생성)-> .o 파일 생성.(4) 링크 : 여러 목적 파일과 라이브러리를 결합하여 실행 파일 / 라이브러리를 생성 (exe / dll / so), 심볼 해석.-> .exe / dll 생성. ex) 컴파일 기본적인 흐름 예시(0) 소스 파일 Input.// add.h#ifndef ADD_H#d..

[C++] QueryPerformanceCounter() 함수와 QPC를 활용한 메모리 할당 전략 비교

목차QueryPerformanceCounter()와 profileapi.h 함수응용 / 심화요약1. QueryPerformanceCounter()와 profileapi.h 함수QueryPerformanceCounter() QPC라고 불리며 Windows의 profileapi.h 헤더에 포함된 고정밀 시간 측정 Windows API 함수.BOOL QueryPerformanceCounter( [out] LARGE_INTEGER *lpPerformanceCount); - 현재 성능 카운터 값을 반환. (CPU의 TickCount(클럭)를 반환)- 정밀한 시간 측정으로 성능 테스트에 필수.- LARGE_INTEGER 형의 정수 값 포인터를 파라미터로 받아 해당 파라미터에 결과 값을 반환.- 리턴에 성공하면 0..

[RAD Studio] FastMM을 통한 메모리 관리

목차FastMMFastMM 설치 및 환경 설정FastMM을 통한 메모리 관리FastMM 환경 설정 관련 오류 해결1. FastMMFastMM은 Windows용 메모리 관리자로 델파이에서 사용 가능한 메모리 관리자임.FastMM 라이브러리를 프로젝트에 포함하게 되면 기존과 new / delete 하는 코드는 동일하나 내부적으로 컴파일 단게에서 메모리 할당과 해제 코드의 앞뒤에 가드 패턴을 삽입하여 메모리를 관리. - 옵션은 .inc 파일을 사용자가 직접 수정하여 라이브러리와 동일한 경로에 위치시키면 컴파일 단계에서 해당 inc 파일을 참조. 2. FastMM 설치 및 환경 설정본문에서는 FastMM4를 사용하며, 해당 파일 패키지는 검색을 통해 쉽게 찾을 수 있음. - 다운받은 파일을 확인하면 상위의 Fa..

DevKit/IDE - RAD 2026.01.28

[C++] 메모리 / 핸들 누수 및 추적 도구

목차메모리 및 핸들 누수응용/심화요약1. 메모리 및 핸들 누수 누수 : 해제되지 않은 자원이 누적되어 성능 저하 혹은 크래쉬를 일으키는 현상.-> 메모리 누수와 핸들 누수는 원인이 다르므로 분리 접근하여야 함. Heap 누수 : 메모리 증가 혹은 느려짐 등의 증상이 있으며 원인은 new / malloc 후 해제되지 않은 경우. 핸들 누수 :파일, 소켓, 이벤트 그리고 가장 흔한 GDI/User 오브젝트 누수 등이 있으며 Windows OS는 프로세스 당 핸들 수 제한이 있어서 메모리가 넉넉하더라도 핸들이 고갈되면 새로운 윈도우를 띄우거나 통신을 할 수 없는 등의 증상이 발생. 원인으로는 CloseHandle 누락이 대표적. 리소스 오염 :공유 자원을 획득만 하고 해제하지 않아 발생, 자원은 획득하였으나..

[C++] C++ 기호 시퀀스

목차C++ 기호 시퀀스응용/심화요약1. C++ 기호 시퀀스기호 시퀀스(Escape Sequence) :제어 문자 / 특수 문자를 문자열 / 문자 리터럴로 표현하는 규칙.-> 실무에서 로그/프로토콜/파일 포맷이 보이지 않는 문자(\r, \n 등) 에 의해 깨지는 경우가 발생하기 때문에 디버깅에서 중요.-> 일반적으로 사용되는 텍스트 기반 프로토콜(JSON, CSV, XML) 혹은 시리얼 통신은 특정 제어문자를 기준으로 데이터 시작과 끝을 알림. 자주 사용되는 Escape 문자 \n개행 (New Line)줄을 바꿉니다\t탭 (Tab)수평 탭 간격을 추가합니다\\역슬래시\ 문자 자체를 출력\'작은따옴표문자 리터럴에서 ' 출력\"큰따옴표문자열에서 " 출력\r캐리지 리턴커서를 줄 맨 앞으로 이동\b백스페이..

[C++] sprintf() vs snprintf()

목차1. sprintf() vs snprintf()2. 응용/심화3. 요약 1. sprintf() vs snprintf() sprintf :sprintf 함수는 문자열을 생성하는 함수.printf()와 유사하지만 출력 대신 문자열을 버퍼에 저장. int sprintf(char str, const char format, ...); - str : format을 복사해서 저장할 곳.- format : 서식지정자가 포함된 문자열- 반환 : 생성에 성공한 문자의 개수. (실패 -1)- 배열 크기를 넘어서는 문자열을 저장하면 버퍼 오버플로우 발생. #include void MyFunc() { char buff[30]; int n1 = 1; int n2 = 2; sprintf(buff, "n..

[C++] _wtoi, wcstoul

목차1. _wtoi, wcstoul2. 응용/심화3. 요약 1. _wtoi, wcstoul _wtoi :문자를 숫자로 변환해주는 Window API 함수, 간단하지만 에러 정보가 부족.-> 실패 시 0을 반환하는 경우(Input이 "0"인 경우) 에러 판별 어려움.-> 부분 파싱 미지원, 문자열을 부분적으로 읽더라도 문자열이 남았다는 사실을 알려주지 않음.-> 오버플로우 감지 불가, int 범위를 넘어서는 숫자가 들어오더라도 알려주지 않고 데이터 왜곡. int _wtoi( const wchar_t *str);// 사용자가 오타를 내면 무조건 0으로 설정됨// 제어기 로직에서 0이 '정지'를 의미한다면 큰 사고로 이어질 수 있음int value = _wtoi(inputString);SetDeviceV..

[C++] Size vs Capacity

목차1. size vs capacity2. 응용/심화3. 요약 1. size vs capacitysize : 현재 들어있는 원소 개수를 의미, 논리적 크기, size() 등으로 확인 가능.capacity : 재할당 없이 담을 수 있는 원소 개수, capacity()로 확인 가능, vector가 보유한 여유 메모리.-> size가 capacity를 넘어서는 순간 vector는 더 여유있는 곳으로 메모리를 옮기는 재할당을 수행.-> 당연히 size보다 capacity가 크거나 같음. - 이 둘을 구분하지 못하면 루프 등에서 재할당이 반복되어 성능이 급락, reserve()는 이 비용을 제어하는 핵심 도구.- 동적 배열 등은 매 삽입마다 재할당하면 성능이 급락하게 되고 이를 방지하고자 vector는 capac..

[C++] size_t

목차1. size_t2. 응용/심화3. 요약 1. size_tsize_t :메모리 크기, 배열 인덱스 등을 표현하기 위한 부호 없는(Unsigned) 정수 타입.32비트 시스템에서는 32비트, 64비트 시스템에서는 64비트로 사용되며 즉, 주소 공간 전체를 가리킬 수 있음.일반적으로 sizeof 함수의 결과 타입이며, 결과가 음수의 의미를 갖는 경우 signed 타입이 필요함. 2. 응용/심화int형과의 차이int형 : 연산 및 로직에 쓰는 일반 정수 타입, 크기 및 부호는 플랫폼에 따라 차이가 있음.실무에서 signed 혹은 unsigned 혼합으로 혹은 32/64비트에서 오버플로우 발생이 잦음.C++ 표준에서는 최소 16비트 이상으로만 규정되어 있으며 현대 윈도우 64비트 아키텍처에서 여전히 32비..

반응형