'프로그래밍/C++'에 해당되는 글 9건
- 2015.09.10 파일 로깅
- 2015.09.04 c++11 pair<> class
- 2015.08.11 secure socket programming
- 2013.12.02 winsock broadcast 예제 소스
- 2013.11.28 c++ unsigned 변수
- 2013.11.05 element size of array
- 2013.10.23 상속 관계에서 access modifier 2
- 2013.10.17 객체를 반환하는 함수
- 2013.10.14 배열과 포인터
c++11 pair<> class
프로그래밍/C++ 2015. 9. 4. 14:20 |pair<> 클래스
pair 는 c++98 에도 이미 제공되고 있었다.
pair 는 두 객체를 하나의 타입으로 묶어 사용한다.
예를들면, 2차원 평면 상에서 좌표를 표현하는 경우 다음과 같이 사용할 수 있다.
또 map 계열의 클래스는 키와 값의 쌍으로 구성되는데 이때도 pair 를 사용한다.
각 타입은 template 으로 정의 되므로 다른 타입이 사용될 수 있다.
pair 를 선언을 하면 선언 시에 사용된 객체의 default constructor 가 불리며 int 와 같은 primitive 타입이라면 0 으로 초기화 된다.
pair 정의 코드
pair 는 c++11 에서 크게 확장된 것은 없지만 표준 확장에 따라 move constructor 가 제공되고 swap() 이 추가되었다.
그 외 사용법은 c++98 에 비해 크게 달라진 점은 없다.
멈버 변수인 first 와 second 가 public 으로 선언되어 있기 때문에 접근 제한 없이 사용할 수 있다.
pair 를 간단히 생성하기 위해서 make_pair() 라는 함수가 존재한다.
make_pair 는 객체 생성을 위해 따로 타입을 쓰지 않아도 된다.
위 코드 대신 아래와 같이 사용할 수 있다.
make_pair 의 코드:
c++11 의 make_pair 는 rvalue 인자를 받으므로,
해당 타입이 move semantics 를 지원한다면 인자로 전달된 객체가 변경된다.
간단한 테스트 코드 :
secure socket programming
프로그래밍/C++ 2015. 8. 11. 14:00 |secure socket programming
server
컴파일 :
client
컴파일 :
references:
[1] Secure programming with the OpenSSL API, Part 1: Overview of the API : http://www.ibm.com/developerworks/library/l-openssl.html
[2] Korean Version of [1] : http://hasu0707.tistory.com/153
[3] Secure Server Client using OpenSSL in C : http://simplestcodings.blogspot.kr/2010/08/secure-server-client-using-openssl-in-c.html
[4] HTTPS와 SSL 인증서 : http://opentutorials.org/course/228/4894
[5] SSL/TLS Programming : http://www.cs.odu.edu/~cs772/fall08/lectures/ssl_programming.pdf
winsock broadcast 예제 소스
프로그래밍/C++ 2013. 12. 2. 15:18 |대략 winsock 으로 braodcast 하는 c++ 소스입니다.
아래는 테스트용 reader 코드
references :
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=7103&ref=7103
http://blog.daum.net/jjiyong/12873890
c++ unsigned 변수
프로그래밍/C++ 2013. 11. 28. 10:00 |c/c++ 에서 unsigned 변수를 사용할 땐 주의해야 합니다.
수식에서 signed 변수와 unsigned 변수를 섞어 사용하면 타입 변환이 일어납니다.
타입 변환 규칙을 분명히 알고 사용해야 합니다.
(어렵지는 않습니다. 다른 타입을 가지는 변수들의 연산 결과는 더 넓은 표현 범위의 타입을 가집니다.
고로 signed int 와 unsigned int 의 연산 결과는 unsigned int 입니다.
결과는,
4294967295 4294967295 -1 |
입니다.
또한 unsigned 변수를 뺄셈에 사용하면 역시 버그가 발생할 가능성이 생깁니다.
결과가 음수가 나오면 overflow 가 발생하여 예상치 못한 결과가 발생할 수 있습니다.
논리적으로 음수가 절대 발생하지 않는 경우 unsigned 변수를 사용하는 것은 장점이 됩니다.
변수가 0 보다 작은 지를 체크하지 않아도 되기 때문이죠. 예를 들면
하지만 좋은 방법은 아니지만, 의도한 경우 이렇게 사용할 수는 있습니다.
약간의 장점이 있지만, 조심해서 사용해야합니다.
제 생각엔 몇 가지 경우를 제외하면 가능한 unsigned 변수를 사용할 필요가 없다고 생각합니다.
대략 count, size 를 표현해야 하는 경우에만 사용하면 되지 않을까 생각합니다.
java 에는 unsigned 변수 타입이 없습니다. (굳이 따지면 char 는 unsigned 타입이긴 합니다만)
왜냐하면 약간의 장점에 비해 복잡하기 때문입니다.
element size of array
프로그래밍/C++ 2013. 11. 5. 15:43 |array 를 만들 때 크기는 상수로 주어야 한다. 그 이유는 실행 전에 메모리 할당 크기를 알아야 하기 때문이다.
대략, 다음과 같이
int array [10] = {0,};
NOTE: The elements field within brackets [] which represents the number of elements the array is going to hold, must be a constant value, since arrays are blocks of non-dynamic memory whose size must be determined before execution. In order to create arrays with a variable length dynamic memory is needed, which is explained later in these tutorials. [1]
그런데, 요상하게도 gcc 3.4.4 와 4.6.3 에서는 아래 코드가 잘 동작한다.
(비주얼 스튜디오 2010 에서는 바로 9 라인에서 컴파일 에러를 뱉어낸다.)
결과는 대략, (k 에 8을 입력하면)
i : 0x22ac2c k : 0x22ac28 array : 0x22abd0 // k 와 88 차이 (실제 데이터는 64 바이트) array2 : 0x22aba0 // array 와 48 차이 (실제 데이터는 32 바이트) -------------- i : 0x22ac2c k : 0x22ac28 array : 0x22abe0 // k 와 72 차이 (실제 데이터는 64 바이트) array2 : 0x22abc0 // array 와 32 차이 (실제 데이터는 32 바이트. 이건 일치!) |
원래 예상대로라면 k 주소와 array 주소의 값 차이는 64(4바이트 * 16)가 되어야 하지만,
첫 번째 케이스(func)에서는 88 이고,
두 번째(func2)에서는 72 이다.
각각 24바이트와 8바이트가 비는데, 그곳엔 과연 무엇이 존재하는 걸까 ㅡㅡ;
(시간 나면 더 알아보겠음)
비주얼 스튜디오 2010 에서 func2 만 호출해 본 결과는 아래와 같다.
i : 0018F668 k : 0018F65C array : 0018F614 // k 와 72 차이 (실제 데이터는 64 바이트) array2 : 0018F5EC // k 와 40 차이 (실제 데이터는 32 바이트) |
references :
[1] Arrays, http://www.cplusplus.com/doc/tutorial/arrays/
상속 관계에서 access modifier
프로그래밍/C++ 2013. 10. 23. 15:47 |부모 클래스에서 public 이고 자식이 이를 상속받아 private 으로 선언하면 어찌 될까 ?
대략 아래 코드와 같이, 부모의 탈을 쓴 자식 인스턴스를 만들면 멤버함수가 호출이 가능하다.
출력 결과 :
A print
객체를 반환하는 함수
프로그래밍/C++ 2013. 10. 17. 17:43 |객체를 반환하는 함수에서 무슨 일이 일어나는가 ?
$ gcc --version gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
객체를 선언한 후, 다음에 = 을 통해 값을 받으면,
출력 결과는 다음과 같다.
default constructor
default constructor
operator=
destructor
destructor
대략 2 라인에서 기본 생성자로 객체 생성
3라인의 getAAA() 내부에서 기본 생성자로 객체 생성 (임시 객체 생성)
3라인의 = 에서 대입연산자 호출
그리고 즉시 임시 객체 소멸
4라인에서 a 소멸
다음과 같이 이 두 줄의 코드를 한 줄로 변경하면,
default constructor
destructor
레퍼런스 타입으로 함수를 호출하면 역시 동일하다.
default constructor
0 0
destructor
call by value 로 부르면,
default constructor
0 0
destructor
배열과 포인터
배열과 포인터는 거의 유사하게 사용된다.
차이점은, 배열은 값이 변하지 않는 const 속성을 갖는다는 점이다.
즉, 포인터는 주소값을 할당할 수 있지만 어레이 변수는 그게 안 된다.