프로그래밍 일반 74

[C++] 유용한 C++ 기능 - structured binding

C++17에서 도입된 structured binding은 복합적인 데이터 구조를 손쉽게 풀어낼 수 있는 기능을 제공합니다. 이를 통해 배열, 튜플, 구조체 등에서 멤버를 간단하게 추출하여 사용할 수 있습니다. Structured binding은 다음과 같은 문법을 사용합니다: auto [변수1, 변수2, ...] = 표현식; 여기서 표현식은 풀어낼 데이터 구조를 나타내며, 변수1, 변수2 등은 구조체나 튜플의 각 요소에 대응됩니다. 예를 들어, 튜플을 사용한 structured binding은 다음과 같이 보입니다: #include #include int main() { std::tuple myTuple(42, 3.14, "Hello"); auto [a, b, c] = myTuple; std::cout

[C++] 유용한 C++ 기능 - if / switch init statement

if / switch init statement 로컬 변수의 생명주기가 블럭과 같도록 합니다. if 문 이후에 x 변수가 잘못 사용되는 위험을 방지하고 코드의 의도를 명확히 합니다. if (int x = getX(); x > 0) { // x가 0보다 큰 경우에 실행되는 코드 // x를 여기서 사용할 수 있음 } else { // x가 0 이하인 경우에 실행되는 코드 } 위의 예제에서 getX() 함수는 변수 x를 초기화하는데 사용됩니다. 이렇게 하면 if 블록 내에서만 x가 유효하게 됩니다. 다음은 switch에서 사용하는 예시입니다. switch (int value = getValue(); value) { case 1: // value가 1인 경우에 실행되는 코드 break; case 2: // va..

[어셈블리] OllyDbg 소개

어셈블리를 디버깅 할 수 있는 OllyDbg를 소개합니다. 이 툴을 이용하여 어셈블리의 동작을 디버깅 및 확인을 할 수 있어서 어셈블리어를 학습하는데 도움이 됩니다. 그리고, 리버스 엔지니어링 툴로 사용되는 프로그램입니다. OllyDbg 설치 version 2.01을 받습니다. 받은 후 압축을 풀면 OllyDbg.exe 파일을 관리자 권한으로 실행합니다. 기본 기능 & 레이아웃 사용을 위해서는 먼저 실행 파일을 열어야 합니다. 실행 파일을 열면 다음과 같이 로딩되며, 이 화면은 코드뷰, 레지스터 뷰, 덤프 뷰, 스택뷰로 구성되어 있습니다. 코드 뷰에서는 기계어와 어셈블리어를 볼 수 있습니다. 어셈블리어 영역을 마우스 더블 클릭하여 어셈블리 명령어를 입력 할 수 있습니다. 디버그와 트레이스 기능들을 활용하..

Visual Studio 인라인 어셈블리 x86 예제

power #include int power2( int num, int power ); int main( void ) { printf_s( "3 times 2 to the power of 5 is %d\n", \ power2( 3, 5) ); } int power2( int num, int power ) { __asm { mov eax, num ; Get first argument mov ecx, power ; Get second argument shl eax, cl ; EAX = EAX * ( 2 to the power of CL ) } // Return with result in EAX } docs.microsoft.com/ko-kr/cpp/assembler/inline/writing-function..

Visual Studio 2019에서 어셈블리 64bit 프로젝트 생성

어셈블리를 위한 프로젝트 생성 새 빈 콘솔 프로젝트를 만듭니다. 64Bit로 변경합니다. 빌드 종속성에서 masm을 체크합니다. .asm 파일과 .cpp 파일을 하나씩 추가 합니다. asm 파일의 속성을 선택합니다. asm 파일의 항목 형식이 Microsoft Macro Assemply로 선택된 것을 확인 합니다. 어셈블리에서 표준 함수들 사용 할 수 있도록 하자 printf, scanf와 같은 표준 함수들을 어셈블리에서 사용할 수 있게 하려면 다음과 같이 두 개의 라이브러리를 추가해주어야 합니다. 프로젝트 속성의 링커 -> 일반 -> 추가 속성에서 다음과 같이 두 라이브러리를 추가 합니다. legacy_stdio_definitions.lib legacy_stdio_wide_specifiers.lib 예..

CPU 레지스터

레지스터는 CPU 내부에 존재하는 다목적 메모리(저장 공간)입니다. CPU와 함께 있는 메모리 이므로 고속으로 데이터를 처리할 수 있습니다. 간단히 레지스터는 CPU가 사용하는 변수로 생각면 좋습니다. IA-32(Intel Architecture, 32bit) 레지스터의 구성은 아래 그림과 같습니다. 범용 레지스터(General-Purpose Registers)EAX (Extended Accumulator Register)산술연산 명령에서 상수/변수 값을 저장하거나 함수의 리턴 값이 저장되는 용도로도 사용됩니다. EDX(Extended Data Register)EAX와 함께 복잡한 연산을 위한 추가적인 데이터를 저장할 때 사용됩니다. 리턴 값 용도록는 사용되지 않습니다. EDX는 EAX의 확장 개념으로 ..

[C++] std::function

C++11표준 라이브러리의 한 템플릿으로, 함수 포인터 개념을 일반화한 것입니다. 함수 포인터는 함수만 가리킬 수 있지만 std::function은 호출 가능한 객체이면 그 어느 것도 가리킬 수 있습니다. 즉, 함수 처럼 호출 할 수 있는 것이면 그 무엇이라도 std::function으로 가리킬 수 있습니다. 예를 들면 함수, operator(), 람다 함수들이 있으며 다음은 그 예시입니다. int sum(int a, int b) { return a + b; } struct Sum { int operator()(int a, int b) { return a + b; } }; int main() { std::function s1 = sum; std::function s2 = Sum(); std::functi..

[C++] Closure(클로저)

Closure? Lexical binding을 지원하는 함수형 언어로 부터 파생된 개념이며, 코드 블럭을 정의할때 스코프내의 환경들을 기억하여 나중에 수행될 때도 원래의 환경에 따라 수행되는 것을 말합니다. 람다 표현식 VS 클로저 스콧 마이어(Scott Meyers)는 "람다와 클로저의 차이는 클래스와 클래스 인스턴스 사이의 차이점과 동일하다"라는 좋은 예를 들었습니다. 클래스는 오직 소스 코드에만 존재하며 런타임에 존재하지 않습니다. 클래스 인스턴스만이 런타임에 존재합니다. 즉, C++에서는 람다 표현식이 인스턴스화 된 것을 클로저라 합니다. 클로저의 예 #include #include std::function closureWrapper1() { int x = 10; return [x](){std::..

[Effective Modern C++] 항목 4: 연역된 형식을 파악하는 방법을 알아두라

형식 연역의 결과를 직접 확인 하는 수단으로서 코드를 작성/수정하는 시점에서, 컴파일 시점에서, 실행 시점에서 형식 연역 정보를 얻는 방법을 살펴보겠습니다. IDE 편집기 IDE의 코드 편집기 중에서 프로그램 개체(변수, 매개변수, 함수 등) 위에 마우스 커서를 올리면 그 개체의 형식을 표시해 주는 것이 많습니다. const int theAnswer= 42; auto x = theAnswer; auto y = &theAnswer; IDE 편집기는 x의 연역된 형식이 int이고 y의 연역된 형식이 const int*임을 표시해 줄 것입니다. 컴파일 가능 상태여야 편집기에서 요청된 개체의 형식을 표시 할 수 있을 것입니다. 간단한 경우에는 IDE가 알려준 정보가 쓸만합니다. 그러나, 복잡한 형식에서는 그리고..

반응형