프로그래밍 74

@DLL 동적 라이브러리 만들기

컴파일, 링킹 과정을 정리하다가 동적 라이브러리를 만들어보는 예제가 있어서 만들어보고 간단히 정리해보고자 글을 쓴다. ( MSDN 연습 : 자체 동적 연결 라이브러리 만들기 및 사용 C++ 를 참고했다. ) 동적 라이브러리를 만드는 과정은 참고된 링크에 자세히 설명되어있다. 해당 동적 라이브러리 프로젝트 빌드 시, dll 파일이 생성된다. dll 파일은 '윈도우 운영체제' 에서 동적 라이브러리를 적용하기 위해 만든 파일의 확장자 명이다. 리눅스 환경에서는 .so 라는 확장자 명을 사용한다. * 동적 라이브러리 컴파일 시, 라이브러리가 프로그램 안에 내장되어지는 정적 라이브러리와는 달리, 동적 라이브러리는 프로그램 실행 후 운영체제에 부여받는 가상 메모리 위에 올려진다. 운영체제에 의해서 지정된 페이지로 ..

@.NET Framework

.NET Framework 의 구성 * CLI ( Common Language Infrastructure ) https://ko.wikipedia.org/wiki/%EA%B3%B5%ED%86%B5_%EC%96%B8%EC%96%B4_%EA%B8%B0%EB%B0%98 => 실행 코드와 런타임 환경을 설명하기 위해 MS 에서 개발한 '오픈 규격'. => CLI 는 단지 '규격' 이란 것이 중요하다. 1. CTS ( 공통 형 체계 ) 2. 메타데이터 3. CLS ( 공통 언어 규격 ) 4. VES ( 가상 실행 시스템 ) => 해당 규격으로 MS 에서 만든 것이'CLR'이다. * CLR ( Common Language Runtime ) => JAVA 의 JVM 과 비슷한 역할을 하는 .NET Framework ..

프로그래밍/C++ 2022.08.27

@C++ 링킹에 대한 이해

*링킹 ( Linking ) *Linker 는 왜 필요한 것일까 ?? => 모든 obj 파일들을 하나로 합치는 역할. => 컴파일 단계에서, TU 는 독립적으로 실행되기 때문에 합쳐졌을 때의 최종적인 위치를 모른다. 모든 obj 파일을 하나로 합치는 과정과 동시에 심볼들의 정확한 위치를 확정시키는 역할을 링킹에서 수행한다. 간단히 말해서, printf("Hello World"); 에서 printf 는 stdio.h 안에 printf 가 구현되어있다. 즉, 컴파일 단계까지는 printf 의 구현부가 어디있는지 알 수 없다. printf 를 호출한 코드 ( obj ), printf 가 정의된 코드 ( library ) 이 둘을 합치는 과정이 필요. 또한, 데이터 영역의 전역변수도 마찬가지이다. 현재 각 ob..

@C++ 컴파일 에 대한 이해

*전체적인 C++ 컴파일 과정 1. 전처리 단계 => #include, #define .... 전처리기 매크로들을 처리. 2. 컴파일 단계 => 소스파일들을 어셈블리 명령어로 변환. 3. 어셈블 단계 => 실제 기계어로 이루어진 목적 코드 (.obj) 로 변환. 4. 링킹 단계 => 목적 코드 ( obj ) 들을 하나로 모아 실행 파일 생성. *전처리 단계 1. 문자 해석하기 translation character set 2. ' \ ' 문자 해석하기 #define Test(a, b) \ {\ if(a != b)\ {\ a = b;\ }\ }; 3. 전처리 토큰들로 분리 => 소스 파일을 주석, 공백문자, 전처리 토큰 으로 분리하는 단계. 4. 전처리 실행 단계 => #include 파일 내용 복사. =..

#69. c++ 스마트 포인터 ( smart pointer )

*스마트 포인터는 왜 필요할까?? => 포인터 사본을 만들지 않도록 하는 것이 좋다. => 객체 생명주기로 주소값을 가지고 있는 객체들을 먼저 처리하고 참조되어있는 객체를 마지막으로 처리하는 것이 좋다. => 항상 실수 가능성이 있다는 것이 문제. *댕글링포인터 ( Dangling Pointer ) => 이미 존재하지 않는 객체의 주소를 가지고 있는 포인터 => 객체가 삭제될 때 그 객체가 삭제되었다고 알려주어 해당 포인터를 nullptr 해야하는데 딱히 방법이 없다. 이런 상황을 해결하기 위해 스마트 포인터를 사용할 수 있다. *shared_ptr => 참조 카운트 ( ref count ) 사용. shared_ptr k1 = make_shared(); *왜 make_shared 를 사용해 shared_..

프로그래밍/C++ 2022.07.23

#68. 람다 (lambda)

*람다 표현식 ( lambda expression ) [ 캡처 ] ( 매개변수 ) { 구현부 } => '리턴값 자동 추론' [ 캡처 ] ( 매개변수 ) -> 리턴값 { 구현부 } vector vec; auto findIt = std::find_if(vec.begin(), vec.end(), [ ](Item& item) { return item.Rarity == Rarity::Unique; }); *[ ] 캡처 ( capture ) => 함수 객체 내부에 변수를 저장하는 개념과 유사 * [&] : call-by-reference 와 유사 => 외부의 모든 변수들의 주소를 가져온다. int a = 4; auto Changed = [&]() { a = 5; }; => 참조를 사용할 땐 값이 바뀔 수 있음을 인..

프로그래밍/C++ 2022.07.22

#67. 전달 참조 ( forwarding reference )

*전달 참조 ( forwarding reference ) = 보편 참조 ( universal reference ) ( template, auto 와 연관 ) => std::forward 를 사용해야함. std::move : r-value 를 반환. (즉, class&& 로 캐스팅하는 용도 ) * 특수 템플릿 인자 유추 규칙 A&& // -> A& A&&& // -> A& A&&& // -> A& A&&&& // -> A&& template void foo(T&& A); A : 좌측값 ( l-value ) 라면, T&& + &A = T&&& = T&. A : 우측값 ( r-value ) 라면, T&& + &&A = T&&&& = T&&. * && 이 무조건 오른값 참조여야만 하나 ?? => 형식 연역 ( ..

프로그래밍/C++ 2022.07.22

#66. 오른값참조 ( rvalue reference )

*왼값 ( l-value ) => 단일식을 넘어서 계속 지속되는 개체 *오른값 ( r-value ) => lvalue 가 아닌 나머지 개체 ( 임시 값, 열거형, 람다, i++ 등.. ) 즉, 좌측값은 & 연산자를 통해 어떠한 메모리 위치를 가리킬 수 있다. 우측값은 그렇지 않은 값들이다. * 왼값 / 오른값 구별 int test = 20; test = 123 + test; test : 왼값. 123, 20 : 오른값. 123 + test : 오른값. int result = func(); func 의 리턴값 : 오른값. result : 왼값. *이전의 상황 ( 오른값 참조가 없었을 때 ) void TestKnight_Copy(Knight k) {} void TestKnight_LValueRef(Knigh..

프로그래밍/C++ 2022.07.22

#65. enum class & override & final

*enum class ( scoped enum ) 1. 이름공간 관리 ( scoped ) 2. 암묵적인 변환 금지 *enum enum PlayerType : short { None PT_Knight = 5, PT_Archer, PT_Mage, }; enum MonsterType { None // => 재정의 에러 } double value = PT_Knight; => 전역으로 퍼짐. => 이름 재정의 문제 => 암묵적 변환 가능. *override virtual void Attack() override; virtual void Attack() const => OK => virtual 함수인지 알기 어렵다. => override 를 붙이면 기존 부모 virtual 함수를 제거했을 때, 컴파일러가 ERROR..

프로그래밍/C++ 2022.07.22

#64. using

*Using typedef int id; using id = int; *무슨 차이점이 있을까?? 1. 선언 순서 차이 ( 직관성 ), 함수포인터 2. 템플릿과의 호환 template using List = std::list; 하지만, typedef 는 typedef std::list List ; => ( X ) ( 함수나 클래스 외부에서 선언할 수 없음. ) template struct ListT { typedef list type; }; ListT::type li; => typedef 는 간접적으로 struct 를 하나 더 만들어줘야함. 본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다. 강의 듣기 !!

프로그래밍/C++ 2022.07.22