프로그래밍/C,C++ 16

코드 최적화 - 루프 내에서 반복 활용되는 변수 최적화

개념전역 변수나 static 변수는 메모리 계층에서 지역 변수보다 접근 비용이 높을 수 있으며, 컴파일러 최적화가 제한될 수 있습니다.문제점전역/static 변수는 캐시 효율성이 낮을 수 있음컴파일러가 레지스터에 변수를 할당하기 어려움멀티스레딩 환경에서 메모리 동기화 오버헤드 발생 가능컴파일러의 최적화 기회 감소최적화 방법지역 변수로 복사: 루프 시작 전에 전역 값을 지역 변수로 복사작업 완료 후 다시 저장: 모든 계산이 끝난 후 결과를 전역 변수에 한 번만 저장변수 범위 최소화: 필요한 가장 좁은 범위에서만 변수 선언예시// 비효율적인 방법for (int i = 0; i 성능 향상 이유지역 변수는 CPU 레지스터에 저장될 가능성이 높음메모리 접근 횟수 감소컴파일러가 더 적극적인 최적화 수행 가능캐시 지..

코드 최적화 - if-else나 switch-case 대신 배열 인덱스 활용하기

개념조건문(if-else, switch-case)은 분기 예측(branch prediction)에 의존하며, 예측이 틀릴 경우 CPU 파이프라인 플러시가 발생하여 성능이 저하됩니다. 배열 인덱싱은 조건 분기 없이 직접 값에 접근합니다.문제점조건문은 CPU 분기 예측 실패 시 성능 저하여러 조건을 순차적으로 평가하는 비용코드 크기 증가 및 명령어 캐시 효율성 감소최적화 방법룩업 테이블(Lookup Table) 사용: 가능한 모든 결과를 배열에 미리 저장함수 포인터 배열: 다양한 동작을 함수 포인터 배열로 구현비트 마스킹과 배열 조합: 복잡한 조건을 비트 연산과 배열로 대체예시// 비효율적인 방법 (switch-case)int getActionValue(int action) { switch (actio..

코드 최적화 - 구조체 변수 사용 시 체인 최소화하기

개념구조체 체인(chain)이란 obj->a.b.c.value와 같이 여러 단계의 구조체 멤버에 접근하는 것을 말합니다. 이러한 체인이 길어질수록 CPU는 각 단계마다 메모리 참조를 수행해야 하므로 성능 저하가 발생합니다.문제점매 접근마다 전체 체인을 따라가야 함특히 루프 내에서 반복적으로 접근할 때 성능 저하가 심각해짐메모리 계층 구조에서 캐시 미스(cache miss)를 증가시킴최적화 방법포인터 캐싱: 자주 접근하는 깊은 구조체 멤버의 주소를 로컬 포인터 변수에 저장임시 변수 사용: 값을 자주 읽고 쓰는 경우 로컬 변수에 복사하여 작업 후 다시 저장최적화 예시// 비효율적인 방법for (int i = 0; i department.employee.salary += bonus[i];}// 최적화된 방법i..

[C] warning: implicit declaration of function ‘strnstr’

문제점 및 증상오랜만에 라즈베리파이 3에서 C로 작업할 일이 생겨서, 이것 저것 찾아가며 소스를 작성하던 중에 "strnstr()" 함수를 이용하려던 중에 다음과 같은 오류가 발생하였습니다.config_test.c:75:16: warning: implicit declaration of function ‘strnstr’; did you mean ‘strstr’? [-Wimplicit-function-declaration] pStartPort = strnstr(buff, read_count, "\"PORT\":"); ^~~~~~~ strstrconfig_test.c:75:14: warning: assignment to ‘char *’ from ‘int..

Error: Initialization discards qualifiers from pointer target type

문제점 및 증상프로그램 개발 중에 다음 코드에서 "Initialization discards qualifiers from pointer target type" 오류 메시지를 받았다. char *arrReportRegName[] = { "ADE7953_REG8_LCYCMODE", "ADE7953_REG16_LINECYC", "ADE7953_REG16_Period", "ADE7953_REG24_IRQSTATA", "ADE7953_REG24_IRQSTATB" }; 해결 방안참고자료의 내용을 참고해 보면, 위 코드에서 문자열 배열을 초기화하여 선언하는 부분에서, 문자열 상수를 초기화하는데 이용하여는데, 변수는 일반 char * 라서 "Initialization discards qualifiers from poi..

Debug Assertion Failed! vector subscript out of range Line: 932

증상 및 문제점STL의 vector를 사용하던 중에 다음과 같은 오류가 발생하며 프로그램이 중단된다. 원인한줄 한줄 vector를 사용하는 부분을 디버깅하여 본 결과, vector를 참조하는 색인 값을 vector의 실제 크기보다 큰 값을 잘못 입력하여 발생하는 문제입니다.유사한 오류 발생 예제 #include #include "player.h" #include "enemy.h" #include #include using namespace sf; int main() { RenderWindow window(VideoMode(800,600), "Deine mudda"); Clock clock; int timecount = 0; std::vector enemyv; Player player1("player.pn..

warning D9030: '/Gm' is incompatible with multiprocessing; ignoring /MP switch

증상 및 문제점VC++ 프로젝트를 빌드하면 다음과 같은 warning이 나타난다. warning D9030: '/Gm' is incompatible with multiprocessing; ignoring /MP switch 프로젝트의 전체 소스의 개수가 5개도 안되는데 컴파일하는데 매우 느림(소스 파일 1개씩 컴파일이 되고 있음). 해결책D9030 warning가 발생하는 이유는, 말 그대로 /Gm 스위치와 /MP 스위차가 함께 쓰여서, /MP 스위치가 무시되면서 발생하는 경고입니다.가장 쉬운 방법은 /Gm{최소 다시 빌드 사용} 옵션을 끄는 것입니다.해당 옵션을 끄는 방법은 다음과 같습니다. 프로젝트의 속성 페이지 대화 상자를 엽니다.C/C++ 폴더를 클릭합니다.코드 생성(Code Generation)..

[wxWidgets] 파일 삭제 방법(How to delete a file)

wxWidget 도움말에서 파일을 삭제하는 함수를 찾아 보았으나, 찾기가 어려워서 구글링을 하였더니, 바로 답이 나왔다.윈도우의 DeleteFile 함수를 사용하는 방법도 있겠으나, wxWidget 스럽게 사용하기 위해서는...wxRemoveFile 함수를 사용하면 된다. bool wxRemoveFile (const wxString & file)Removes file, returning true if successful. Include file: #include 참고자료How to delete a file?

[wxWidgets] assert "assert GetEventHandler()== this" failed in ~wxWindowBase()

Windows 7 / Mingw32 / wxWidget-2.9.4 / C::B문제점 및 증상wxWidgets의 wxAuiManager로 작성된 프로그램을 종료할 때, 다음과 같은 Debug Alert 창이 나타남 : assert "assert GetEventHandler()== this" failed in ~wxWindowBase() 해결 방안Frame가 소멸될 때, AuiManager의 UnInit() 함수가 정상적으로 호출되지 못하여 발생Frame 소멸자에서 wxAuiManager.UnInit() 함수 호출 MyFrame::~MyFrame() { m_pAuiManager->UnInit(); } 참고자료assert GetEventHandler()== this failed

[wxWidgets] assert "nModes == 1" failed in MSWGetStyle(): wxListCtrl style

문제점 및 증상프로그램을 최초 실행할 때, 다음과 같은 Debug Alert 창이 나타남 : assert "nModes == 1" failed in MSWGetStyle(): wxListCtrl style 원인 분석경고창에 표시된 대로, 클래스에서 생성한 wxListCtrl 컨트롤의 Style에서 화면 표시 모드에 관련된 속성이 단 한 개가 설정되어야 함 하나도 설정하지 않거나, 두 개 이상을 설정하면 위와 같은 Debug Alert 창이 나타남 해결 방법위 wxListCtrl style 에서 붉은색 사각형 내의 4개중 한 개만 설정하고 빌드

728x90