2020년 6월 15일 월요일

Capter2( const, 실행중인 프로그램의 메모리 구조, 참조자, 참조자와 함수)


  • 키워드 Const
    • const int num = 10;   -> 변수 num을 상수화한다.
    • const int* ptr1 = &val1;  -> ptr1을 통해서 val1의 값을 수정하지 못한다.
    • int* const ptr2 = &val2;  -> ptr2는 상수화 된다. 따라서 val2의 주소외 다른 주소를 못가진다.
    • const int* const ptr3 = &val3;  -> ptr3는 상수화 되고, ptr3을 통해 val3의 값을 수정하지 못한다.

  • 실행중인 프로그램의 메모리 구조
    • 코드 영역 : 메모리의 코드영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트영역이라고도 부른다. CPU는 코드영역에 저장된 명령어를 하나씩 가져와 처리하게된다.
    • 데이터 영역 : 프로그램의 전역 변수와 정적(static)변수가 저장되는 영역이다. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램 종료시 소멸된다.
    • 스택 영역 : 함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역이다. 스택영역은 함수의 호출과 함께 할당되며, 함수호출이 완료되면 소멸한다. 이렇게 스택영역에 저장되는 함수의 호출정보를 스택프레임 이라고 한다. 스택은 푸시동작으로 데이터를 저장하고 팝동작으로 데이터를 인출한다. 가장 늦게 저정된 데이터가 가장 먼저 인출되는 구조이며, 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
      • 스택 프레임 : 함수가호출되면 스택에는 함수의 매개변수, 호출이 끝나고 돌아갈 반환 주소값, 함수의 선언된 지역변수 등이 저장된다. 이렇게 스택영역에 차례대로 저장되는 함수의 호출 정보를 스택프레임 이라고 한다. 스택프레임으로 인해 해당 함수가 함수의 일을 마친뒤 이전 상태로 돌아갈수 있는것이다.

    • 힙 형역 : 사용자가 관리할 수 있는 메모리 영역이다. 사용자에 의해 메모리를 동적으로 할당하고 해제하며 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
  • 참조자(Renference) : 할당된 하나의 메모리 공간에 둘 이상의 이름을 부여하는것으로 &연사자를 이용한다.  &연산자는 변수의 주소를 반환하는 연산자 이지만 변수 선언시 사용하게 되면 참조자의 선언이 된다. (ex int &num2 = num1; ) 
    • 참조자는 별칭이다.
    • 참조자의 수에는 제한이 없으며, 참조자를 대상으로도 참조자를 선언할수 있다.
  • 참조자와 함수 : C언어에서 Call-by-reference는 포인터를 이용하여 변수의 값을 수정하였다. 하지만 C++에서는 참조자를 이용하여 Call-by-reference구현할수 있다. 아래 구현 내용을 참고한다. 


2020년 6월 14일 일요일

Chap1(함수오버로딩, 매개변수 디폴트, 인라인 함수, 이름공간)

  • 함수 오버로딩 : 함수의 이름은 동일하지만 매개변수의 개수와 자료형이 다른경우 별개의 함수로 구분하는것. (C언어에서는 함수 이름만을 이용하여 호출대상을 찾기때무에 오버로딩을 허용하지 않지만 C++에서는 함수이름과 매개변수 선언을 보고 호출대상을 찾는다)
Ex>


  • 매개변수 디폴트 : 함수의 매개변수값을 기본으로 지정하여, 함수 호출시 매개변수의 인자값이 없을경우 지정된 값으로 설정된다. 주의  함수 선언부에서 설정해야한다. 
Ex>


  • 매크로함수 장/단점
    • 장점 
    1. 일반 함수보다 매크로함수의 실행 속도가 빠르다. 이유는 일반 함수의 경우 함수호출이 일어나면 매개변수나 호출자의 주소를 스택에 저장하는 행위를 하는 반면 매크로함수의 경우 전처리기에서 호출자를 치환해주기때문에 스택에 저장하는 등의 행위를 피할수 있다.
    2. 자료형에 의존적이지 않다. 
    • 단점 
    1. 매크로 함수의 경우 크기가 증가할 수록 괄호를 많이 써야하기때문에 가독성이 떨어진다.
    2. 디버깅이 어렵다.
  • 인라인(inline)함수 
    • 인라인을 직역하면 프로그램 코드라인 안으로 들어가버린 함수
    • 인라인함수는 매크로와 동일한 일을 한다. 단 일반 함수처럼 정의가 가능하다.
    • 매크로 함수는 전처리기에서 처리가 되지만 인라인함수는 컴파일 단계에서 컴파일러에 의해 처리되기때문에 인라인화가 성능에 해가된다고 컴파일러가 판단되면 컴파일러는 인라인 키워드를 무시하기도 하고, 일반 함수가 인라인화하여 성능향상에 도움이 된다고 판단하면 일반 함수로 인라인화 시키지 않아도 컴파일러에 의해 인라인 함수로 취급된다.


  • 이름공간(namespace)
    • 등장배경 : 예를 들어 은행관리 시스템 관리 프로그램을 만드는데 3개의 회사가 참여하였고 프로젝트 규모가 커서 일을 구분하여 독립적으로 진행하기로 했다고 가정하자. 3개의 회사는 각 각 개발을 완료하였고 3개의 회사가 모여 하나의 프로젝트를 완성하는 단계에서 함수의 이름이 동일하여 컴파일 문제가 발생하게 되었다. 이는 협업 과정에서 모든 함수의 이름을 만들때 규칙이 없었기 때문일 수도 있지만 이런 문제가 발생하게 되었을대 이름공간이 문제를 해결할 수 있다.
    • 사용방법은 아래 코드를 참고한다. 
    • 참고로 동일한 이름공간의 함수들은 이름공간의 명시 없이 사용가능하다.


    • 이름공간의 중첩 : 이름공간은 다른 이름공간 안에 삽입될수있다. 


    • using을 이용한 이름공간 명시 : 키워드 using을 이용하면 이름공간을 지정하지 않고도 함수를 호출할 수 있다. 아래 코드에서 main()함수의 using의 선언한 HybFunc()은 함수, 변수 모두 선언이 가능하다. 단, 지역변수 선언과 마찬가지로 지역을 벗어나면 그 효력을 읽게 된다.


    • 이름공간의 별칭 지정 : 이름공간의 중첩과 같이 여러개의 중첩이 일어난 경우 이름에 별칭을 부여할수도 있다.(개인적으로 이건 좀.... 아닌거같다)


    • 범위지정 연산자의 또다른 기능 : 지역변수의 이름과 전역변수의 이름이 동일한 경우 전역변수는 지역변수에 의해 가려지게 된다. 이런경우 전역변수를 사용할수 있게 해주는것이 범위지정 연산자 이다. 


2020년 6월 4일 목요일

이클립스 + Doxygen 연동

Doxygen은 소스파일에서 문서를 생성하는 컴파일러입니다.
Doxygen과 함께 사용하는 패키지로 Graphviz와 Mscgen을 많이 사용하는데, Graphviz는 다이어그램과 그래프를 그리는 패키지 이며 적극 권장합니다. 또한 Mscgen는 Graphviz와 유사하지만 메시지 시퀀스 다이어그램에 더 단순하고 최적화 되었습니다. Mscgen는 선택사항입니다.

다운로드 경로 :
Doxygen : https://anb0s.github.io/eclox/
Graphviz : http://www.graphviz.org
Mscgen : http://www.mcternan.me.uk/mscgen/


  1. 이클립스 + Doxygen 연동
    1. Doxygen을 다운로드 받고 압축을 해지한다.
    2. 이클립스 실행후 도움말 -> Install New Software -> 압축 해지한 Doxygen 폴더 추가 
    3. Eclox Doxygen, Eclox0.11 을 선택하고 다음 진행
    4. 설치가 완료
  2. 이클립스 doxygen 설정
    1. 아래 그림과 같이 설정





VITIS Git + Doxygen Config

 Doxygen Configure 1. Vitis 메뉴의 Window->Preference의 C/C++ -> Editor의 Documentation tool comments 기본 설정값을 Doxygen으로 변경 설정 후 함수 바로 위에서 /...