2013년 8월 23일 금요일

가변길이 패킷 테스트 소스(Variable-length packets sample source)

프로젝트가 끝나고 궁금해서 testcode 만들어봄!!메모리해제 어.떡.하.지!!

2013년 8월 19일 월요일

C/C++ 디폴드 인자 (default parameter)

디폴트인자는 함수를 호출할 때 인자를 생략하면 디폴트 값이 자동적으로 사용되도록 하는 방법이다.

이것을 사용하는 상황은 함수를 재사용할때 쓸수 있을 것이다.
디폴트 인자는 하나 혹은 모든 함수에 적용해도 상관없다.

코드 최적하 문서들을 찾아보면 함수에 인자의 갯수가 적을수록 함수를 호출하는데 있어서
오버헤드가 적다고 나와있다.

그렇다면 함수를 재사용할때 변동되지 않는 인자를 디폴트인자로 설정해 놓는다면 그만큼 넘겨야되는 값이 적기 때문에 효율적이게 될 것이다.

이제 디폴트 인자를 사용하는 예를 살펴보자.

 


#include "stdafx.h"
#include 

using namespace std;

enum INT_TYPE{
 DECIMAL,
 OCTAL,
 HEXADECIMAL,
};

void PrintArray(const int arr[], int size = 5, INT_TYPE type = DECIMAL);

int _tmain(int argc, _TCHAR* argv[])
{
 int arr1[] ={10, 20, 30, 40, 50};
 int arr2[] ={10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
 
 //디폴트 인자는 오른쪽 인자부터 지정한다.
 PrintArray(arr1); 
 PrintArray(arr1, 5, HEXADECIMAL);
 PrintArray(arr2);
 PrintArray(arr2, 10);  

 return 0;
}

void PrintArray(const int arr[], int size , INT_TYPE type ){
 cout.setf(ios::showbase); //일단은 정수를 출력할 때 진법 정보를 함께 출력하는 기능! 

  for(int i=0; i<size; i++)
  { 
   switch(type)
   {
    case DECIMAL:  cout << dec; 
     break;
    case OCTAL:   cout << oct; 
     break;
    case HEXADECIMAL: cout << hex; 
     break;
   }
   cout.width(5);
   cout << arr[i] <<" ";
  }
  cout << endl;
}
 
결과:
 






위에서 사용한 디폴드 인자는 규칙이 있다.
1.디폴드 인자를 지정할 때의 규칙은 오른쪽 인자부터 지정해야 한다.
2.몇개를 하던 상관없다.
3.함수의 인자를 생랼할 때 함수의 가장 오른쪽 인자부터 생략해야된다.
4.인자를 생략할때 오른쪽 인자를 생략하지 하지않고 왼쪽 인자를 생략하는 것은 불가능하다.
5.인자 모두를 생략해도 된다.


C/C++ 매크로함수 vs inline 함수

C에서 C++ 의 inline 함수와 비슷하게 사용되는 것이 바로 매크로 함수이다.

매크로 함수도 함수 호출 시 발생하는 오버헤드 없이 함수가 호출되는 곳마다 함수의 내용을
복사해서 넣어준다. 하지만 매크로 함수는 실제로는 함수가 아니다. 매크로 함수를 정의 할 때는 # define 문을 사용하는데, #define 문은 컴파일 전 단계인 선행처리기(preprocessor)에서 처리된다. 선행처리기는 소스 파일의 텍스트를 읽어 컴파일되기 위한 파일로 준비하는 기능을 제공하는데 그 중 #define문은 소스 파일 내의 특정 문자열을 찾아서 문자열로 대치(replace)하는 기능을 제공한다.

!! 매크로 함수는 선행처리기에 의한 문자열 대치 방식으로 호출될 코드를 삽입하지만, 인라인 함수는 컴파일러에 의한 코드 대치 방식으로 호출될 코드를 삽입한다.

문자열 대치 코드대치.. 무슨소리냐!!?? 느낌은 알겠는데 잘 모르겠다..

예제를 살펴보자.



 

#include "stdafx.h"
#include 

using namespace std;

#define ADD(x,y) ((x)+(y)) //x + y
#define MUL(x,y) ((x)*(y)) //x * y

inline int Add(int x, int y);
inline int Mul(int x, int y);

int _tmain(int argc, _TCHAR* argv[])
{
   cout << MUL(10+20, 30+40) << endl;
   cout << Mul(10+20, 30+40) << endl;

   cout << ADD("abc",10) << endl;
   //cout << Add("abc",10) << endl;

   return 0;
}

inline int Add(int x, int y){
   return x + y;
}

inline int Mul(int x, int y){
   return x*y;
}

위의 코드는 매크로와 inline 함수를 사용하였고
정상적 으로 컴파일된다.(//주석된 부분으로 코딩한다면 어떤 결과가 나올까?)
 
여기서 봐야 될 부분은 더하는(Add) 부분이다.
이전에
 
매크로는 문자열대치
인라인은 코드대치
를 한다고 하였다.
 
 
매크로는 멍청한!? 선행처리기가 #define한 부분을 그대로 문자열을 대치하기 때문에
인자의 형검사를 하지않는다. 그렇기 때문에 오류없이 컴파일 되지만 원하지 않는 값을
얻게 될 수 있다.
 
Inline 함수는 똑똑한 컴파일러가 일반함수를 호출할 때처럼 인자의 값들을 계산하고 다음
호출이 수행된다.
 
C표준에는 없던 inline 함수가 C99에 포함되있는 것도 위와같이 여러가지(산술문제 등.)면에서
좋다라고 생각한다.
 
그렇기 때문에 이둘은 선택의 문제가 아니라 inline이 진보된 기술이기 때문에 앞으로 간단한 함수를 매크로로 만들던 것을 inline으로 사용해야 하면 더욱 안정적이라 할수 있겠다.

2013년 8월 18일 일요일

C/C++ 시간 있을때 기초부터 다시!!

입사후 첫 프로젝트를 하다가 멘붕이와서 다시 공부하려 한다.

진짜 C++ 문법을 쓰기 하기위하여!! 잠시 안녕 C야..