프로그래밍 언어 64

함수와 스택 그리고 호출 스택

너무 짧은 코드의 함수화는 주소지를 찾아가야하기 때문에 비효율적이다.하지만 inline 함수는 자주 쓰이기 때문에 짧은 코드를 활용하기 좋다. C/C++ 및 어셈블러는 x64 환경에서RSP의 현재 주소를 초과하는 모든 메모리는 휘발성으로 간주된다.OS 또는 디버거는 사용자 디버그 세션 또는 인터럽트 처리기 중에 이 메모리를 덮어쓸 수 있다. 따라서 스택 프레임에 대한 값을 읽거나 쓰기 전에 항상 RSP를 설정해야 한다.이 섹션에서는 로컬 변수에 대한 스택 공간 할당 및 alloca 내장 함수에 대해 설명한다. 스택 할당 함수의 프롤로그는1) 로컬 변수, 2) 저장된 레지스터, 3) 스택 매개 변수 및 4) 레지스터 매개변수에 대한 스택 공간을 할당한다. 매개 변수 영역은 항상 스택의 맨 아래에 있다(al..

동적 바인딩 정적 바인딩

바인딩이란? "컴퓨터 프로그래밍에서 각종 값들이 확정되어 더 이상 변경할 수 없는 구속(bind) 상태가 되는 것" 프로그램 내에서 변수, 배열, 라벨, 절차 등의 명칭, 즉 식별자가 그 상대인 메모리 주소, 데이터형 또는 실제값으로 배정되는 것이 이에 해당되며, 원시 프로그램의 컴파일링 또는 링크 시에 확정되는 바인딩을 정적 바인딩이라 하고, 프로그램의 실행되는 과정에서 바인딩되는 것을 동적 바인딩이라고 한다. 프로그래밍에서는 바인딩을 가급적 뒤로 미루도록 권고하고 있다. 즉, 프로그래머가 코딩을 해서 컴파일을 하게되면 각각의 코드가 메모리 어딘가에 저장되고, 함수를 호출하는 부분에는 그 함수가 저장된 메모리의 주소값이 저장되며 프로그래머가 값을 변경할 수 없는 상태가 된다. 정적 바인딩이란? 실행 이..

재귀함수

재귀함수란  유사한 하위 작업 형태로 정의할 수 있는 작업을 처리하는 데 유용하게 쓰인다.예를 들어 정렬이나 검색, 종주 문제에는 간단한 재귀적인 형태의 풀이가 있는 경우가 흔하다. 재귀적인 루틴에서는자기 자신을 호출하여 하위 작업을 처라하는 방식(=재귀 케이스)으로 작업의 일부분을 수행한다. 재귀 호출을 하다보면 자신을 호출하지 않고도 처리할 수 있는 하위 작업(=기본 케이스)이 나온다. 이렇게 루틴에서 자기 자신을 호출하는 것을 재귀 케이스라 말하고,자기 자신을 호출하지 않아도 되는 경우를 기본 케이스라고 부른다. 재귀 알고리즘에는 재귀 케이스와 기본 케이스, 이렇게 두 가지 케이스가 있다. 간단하고 널리 알려저 있는 예제인 팩토리얼 연산을 통해 이 개념을 확인해보자. // n이 1초과일 경우의 팩토..

L-value, R-value

L-value와 R-value는 copy, move와 관련이 있다. 주소값을 가지고 있는 친구는 L-value이다. 즉 L-value는 callable한 변수, R-value는 한번 쓰고 다시 안쓰는 변수를 말한다. int a = 3; a = b; 여기서 a,b는 L-value, 3은 R-value라고 생각하면 편하다. 좌측값 참조자는 &, 우측값 참조자는 &&이다. 한번쓰고 버려질 것이면 copy보단, move가 적절하게 사용할 것이고, callable한 것은 copy가 더 적절할 것이다. 이를 vector를 예시로 하게된다면 void push_back (const T& value); void push_back (T&& value); 좌측값 참조를 사용하게 된다면, stack에 가리키는 주소의 메모리가..

구조체 바이트 패딩 규칙

단순 클라이언트의 작업만을 생각했을 땐 구조체 혹은 클래스의 순서를 중요하게 생각하지 않았었다. 하지만 서버에서는 구조체, 클래스의 패딩 규칙이 중요하다 이에 따라서 구조체 전체 크기가 달라지기도 하기 때문이다. 구조체를 이용하여 새로운 자료형을 정의하여 사용할 때, 정의된 자료형은 컴파일러에 의해 데이터로 변환되고, 이어서 메모리에 저장된다. 컴퓨터 프로세서가 메모리에 '어떤 방식'으로 접근하여 데이터를 읽어가고 컴파일러가 프로그램 코드를 '어떤 규칙'으로 데이터로 변환하는지를 확인하여 보자 이를 통해, 처리속도가 빠르고 효율적으로 메모리를 사용하는 자료형을 구성할 수 있을 것이다. 1. 빈 구조체 혹은 클래스는 4바이트의 메모리 공간을 차지하게 된다. 2. 먼저 나열한 순서 대로 메모리 공간을 순차적..

const int *, const int* const, int* const

int const * int const * 는 const int 형을 가리키는 포인터로 포인터 값은 변경(주소 변경)이 가능하므로 다른 것을 가리킬 수 있으나 내부의 int 값은 const로 선언되어 변경이 불가능하다. int* const int* const 는 const 포인터가 int형을 가리키고 있으므로 포인터의 값(주소)은 변경이 불가능하고 내부의 int형으로 표현된 값은 변경이 가능하다. const int* const 는 가리키는 주소와 주소 내부의 값 모두 상수화 한 것이다.

다이나믹 캐스트

다이나믹 캐스트란? C++ 캐스팅 연산자에는 4가지 유형의 캐스트가 있다. 그 중의 하나인 다이나믹 캐스트는 교차 캐스트를 수행할 수도 있으며 이를 통해 동일한 클래스 계층 구조를 사용하기가 핵심이다. ++ 구글 C++ 가이드에 따르면 RTTI 항목에 보면 다이나믹 캐스트와 typeid 사용을 지양하고있다. 이는 클래스 구조를 잘못 짠 원인이며, 이를 고려하지 않은 구조가 유지 보수하기 더 수월하다는 의견이 있다. 그만큼 다이나믹 캐스트는 신중하게 사용해야 하나보다 했다. ++ 다이나믹 캐스팅을 말하기 전에, 캐스팅이란, C++언어에서는 클래스가 가상 함수를 포함하는 기본 클래스에서 파생되는 경우 해당 기본 클래스 형식에 대한 포인터를 사용하여 파생 클래스 개체에 있는 가상 함수의 구현을 호출할 수 있다..

C++ 복사 생성자, 이동 생성자, Push_back, emplace_back

복사, 이동 생성자 등을 정의하는 이유 유저가 직접 동적할당하는 new의 경우에 얕은 복사를 방지하기 위해서이다. vector, string, 스마트 포인터는 이와 무관하다. 이동 연산자 클래스에서 컴파일러가 알아서 만들어주는 메소드 1. 생성자 2. 소멸자 3. 복사 / 이동 생성자 4. 복사 / 이동 연산자 유저가 클래스 내의 멤버 변수로 포인터를 사용한다면 소멸자, 복사 / 이동 연산자 및 할당자를 관리해야 한다. 초기화 할 때는 습관적으로 brace initialization - {} 을 사용하도록 하는 것이 좋다. 이는 C++11에서 추가된 우측값 레퍼런스와 연관이 있다. 처음에 보면 다소 생소할 수 있는 개념이지만 천천히 학습하다보면 이해 가능하다. 복사 생략(Copy Elision) #inc..

STL 컨테이너

STL 컴포넌트의 개요 STL에는 여섯 가지의 주요 컴포넌트 즉, 컨테이너(container), 제너릭 알고리즘(generic algorithm), 반복자(iterator), 함수 객체(function object), 어댑터(adaptor), 할당기(allocator)가 포함되어 있다. 컨테이너 객채들의 컬렉션을 저장하고 있는 객체를 SLT에서는 컨테이너라고한다. STL에는 두 가지 종류의 컨테이너가 있는데, 하나는 시퀀스 컨테이너이고, 다른 하나는 정렬 연관 컨테이너이다. 시퀀스 컨테이너 시퀀스 컨테이너는 타입이 동일한 객체들을 선형으로 구성한 컬렉션이다. STL의 시퀀스 컨테이너에는 다음 세 가지 종류가 있다. vector : 가변 길이 시퀀스를 임의 접근(random access)할 수 있으며, 시..

STL - 제네릭 프로그래밍과 템플릿

제네릭 프로그래밍 방식 제네릭 프로그래밍 방식에 따라 설계한 소프트웨어 라이브러리는 기존의 다른 소프트웨어 라이브러리와 비교했을 때 몇 가지 뚜렷한 차이점을 발견할 수 있다. 기존의 컴포넌트 설계 방식으로 만들어진 컴포넌트의 조합보다는, 제네릭 프로그래밍 방식에 따라 치밀한 구성과 상호 교체 가능성을 지니도록 만들어진 컴포넌트들의 조합이 다방면에서 더 유용하다. 데이터베이스나 사용자 인터페이스와 같이 다소 특화된 분야에서 사용할 컴포넌트를 추가로 개발하고자 할 때, 제네릭 프로그래밍은 컴포넌트 개발을 위한 근간으로 사용하기에 적당한 설계 방식을 제공한다. 컴파일-타임 매커니즘을 사용하고 ( = 가상 함수는 런-타임 메커니즘이며, STL에서는 가상 함수를 사용하지 않는다), 알고리즘 관련 이슈들에 관해 충..