'Short Articles'에 해당되는 글 16건

  1. 2013.07.20 deprecated declaration (VC++)
  2. 2013.06.26 [C++11] Range Based For-Loop with custom type.
  3. 2013.03.12 [C++11] std::condition_variable_any
  4. 2013.03.11 std::async - std::launch policy
  5. 2012.04.21 Template Keywords & Introduce Templates Meta Programming
  6. 2012.04.07 Class Template
  7. 2012.03.31 Function Template
  8. 2012.02.27 음의 정수의 표현, 보수법 1
  9. 2012.02.22 C++ Template, Expression Templates #4 2
  10. 2012.02.21 C++ Template, Expression Templates #3

deprecated declaration (VC++)

Short Articles 2013. 7. 20. 20:30

오랫만의 포스팅 이군요.


deprecated 선언에 대한 간단한 얘기를 좀 남겨볼까 합니다.


보통 C++ 를 배우고 Visual C++ 을 IDE 로 채택해서 작업을 해나가는 프로그래머들이


언뜻 언뜻 CRT 의 함수 중 보안 취약성으로 인해서 C4995 경고를 만나게 되면서


deprecated 에 대해서 인지하게 되지 않나 싶은데요.


msdn (http://msdn.microsoft.com/en-us/library/044swk7y.aspx을 보면 설명이 나오지만


나타내고자 하는 바는 단순합니다. 


deprecated 로 선언된 함수나 타입을 사용할 때 사용자에게 조심하라는 말을 전달하고 싶은 것이죠.


그런데, 프로그래밍을 시작한지 얼마 안되는 시점에서는 이 deprecated 선언의 필요성에 대해서 잘 느끼지 못하지 않나 싶습니다.


그래서 간단한 하나의 예정도를 적어 보자면..


모종의 변환 행렬을 연산해서 3D 공간 상의 Object 의 위치를 얻어 내는 함수가 있다고 가정 합시다.


개발이 진행 되고 서비스를 시작한 뒤 점차 추가적인 컨텐츠를 붙여나가던 도중에 이 함수가 특정 상황에서


내부적으로 행렬 연산을 잘 못하게 되는 버그가 발견 되었다고 칩시다.


이 경우에 가장 첫 번째로 생각하게 되는 솔루션은 해당 함수의 버그를 수정한다 이겠지만 ..


이렇게 할 경우 의도치 않은 상황이 발생할 수 있습니다.


다른 누군가가 이 함수를 가져다 사용하면서 함수의 버그를 수정하기 보다는 잘 못된 수치 만큼을 보정 작업을 추가로


삽입하는 식으로 사용하고 있을지도 모르기 때문입니다.


이런 경우에 택할 수 있는 선택지 중의 하나가 deprecated 선언으로 (이것도 나름의 문제는 있긴 하지만..)


버그가 내재된 기존의 함수를 deprecated 선언을 시키고 새로운 함수를 작성하고 이 후로는 그것을 사용하도록 유도하는 것입니다.


예를 들면,


__declspec(deprecated("리비전 넘버 100 이후로는 이 함수를 사용하지말고 foo_ver2 를 사용하세요."))

void foo() { }


이런식으로요.

:

[C++11] Range Based For-Loop with custom type.

Short Articles 2013. 6. 26. 10:08

커스텀 타입의 멤버 컨테이너에 대해서 range based for 를 지원하고자 할 때,

멤버 또는 전역으로 begin, end 함수를 제공해 주면 된다.

커스텀 컨테이너 타입을 사용 중이라면 해당 컨테이너가 iteration 지원이 되는지 확인한다.


'Short Articles' 카테고리의 다른 글

deprecated declaration (VC++)  (0) 2013.07.20
[C++11] std::condition_variable_any  (0) 2013.03.12
std::async - std::launch policy  (0) 2013.03.11
Template Keywords & Introduce Templates Meta Programming  (0) 2012.04.21
Class Template  (0) 2012.04.07
:

[C++11] std::condition_variable_any

Short Articles 2013. 3. 12. 18:23

cppreference.com 의 condition_variable 문서에 나와 있는 예제 코드를 조금 수정해 본 것입니다.


표준 입력을 통해 문자열을 입력 받는 스레드에서 큐에 문자열을 집어 넣고 notify_one 을 호출하면


대기중이던 5 개의 스레드 중 하나가 큐에 적제된 문자열을 가져다 화면에 출력하는 코드입니다.

코드를 실행시켜 보면 대략 다음과 같은 식이 됩니다.


밀린 입력이 다시 처리될 때 한 스레드에서 일괄 처리되는 것은 좋은 모습이 아니므로
다음과 같이 조금 바꿔 주면 다른 스레드들에 분배됩니다.

:

std::async - std::launch policy

Short Articles 2013. 3. 11. 11:44
아래 코드는 C++11 Overview 의 void future 를 설명하는 부분에 나오는 코드를 이용해서 좀 더 작성해본 것입니다.


기본적으로 C++11 표준에서 정의하는 std::launch 의 열거형 값은 async 와 deferred 두 가지 입니다.

vs2012 의 경우 namespace 가 launch 밑으로 한 단계 더 들어가고 async 와 deferred 외에 any 와 sync 를 더 정의하고 있습니다.

sync 는 deferred 와 동일하고 any 는 async | deferred 로 되어 있는데 MSDN 상에도 any 플래그에 대한 자세한 설명은 나와있지 않습니다.

아마도 컴파일러에게 선택을 맞기는 용도로 쓰이는게 아닌가 생각됩니다.


_launch_policy 값에 따른 결과는 다음과 같습니다.

async


deferred





'Short Articles' 카테고리의 다른 글

[C++11] Range Based For-Loop with custom type.  (0) 2013.06.26
[C++11] std::condition_variable_any  (0) 2013.03.12
Template Keywords & Introduce Templates Meta Programming  (0) 2012.04.21
Class Template  (0) 2012.04.07
Function Template  (0) 2012.03.31
:

Template Keywords & Introduce Templates Meta Programming

Short Articles 2012. 4. 21. 22:53


Keyword.pptx


Meta_Programming.pptx


'Short Articles' 카테고리의 다른 글

[C++11] std::condition_variable_any  (0) 2013.03.12
std::async - std::launch policy  (0) 2013.03.11
Class Template  (0) 2012.04.07
Function Template  (0) 2012.03.31
음의 정수의 표현, 보수법  (1) 2012.02.27
:

Class Template

Short Articles 2012. 4. 7. 09:41

'Short Articles' 카테고리의 다른 글

std::async - std::launch policy  (0) 2013.03.11
Template Keywords & Introduce Templates Meta Programming  (0) 2012.04.21
Function Template  (0) 2012.03.31
음의 정수의 표현, 보수법  (1) 2012.02.27
C++ Template, Expression Templates #4  (2) 2012.02.22
:

Function Template

Short Articles 2012. 3. 31. 09:31
:

음의 정수의 표현, 보수법

Short Articles 2012. 2. 27. 10:43
전 전공이 전자계열, 컴공이나 소프트웨어 계열쪽이 아니라 가끔 이런 기초적인 부분들을 찾아 보곤합니다.
관련 학과를 졸업하신 분들이야 이미 알고 계실 부분이고,
조금만 검색해보면 다 나오는 내용이지만 그래도 간략히 다시 포스팅을 정리해 봅니다.


1. 처음 2진수로 음의 정수를 표현하고자 했던 방식은 최상위 비트를 부호 비트로 두는 것이었습니다.
(최상위 비트가 1 이면 음수, 0 이면 양수)



그림과 같이 +1 과 -1 은 최상위 비트가 0 과 1 로 구별됩니다.

이 방식의 문제점은 0 을 표현하는 데 있어서

00000000
10000000



이렇게 +0 , -0 두 개의 표현이 나오게 된다는 것과
두 수의 부호가 같은지 다른지 등을 구별해서 가산기 로직을 탈 것인지,
감산기 로직을 탈 것인지를 판별하는 등 연산이 복잡해진다는 것입니다.
예를 들어,
(+1) + (-1) 은
0000001 + 10000001 로 표현되는데, 이것을 그대로 더하면 100000010 (-2) 라는 결과가 되버립니다.
그리고 값의 크기 비교도 부호에 따라 판별을 달리해야하는 모순이 생깁니다.
인간의 관점에서는 당연스럽지만 기계에 있어서는 일관된 법칙을 적용하기가 힘들어지는 방식입니다. 


2. 그래서 이 다음으로 나온 방식이 1의 보수법입니다.
1의 보수법에서 음수의 표현은 단순히 해당 수의 각 비트를 반전 시키는 것입니다.
 



1의 보수법은 단순히 비트를 반전시키는 것이기 때문에 부호 처리가 매우 쉬워졌습니다.
음수에 대한 비교 연산 역시 일관성을 갖게 되었습니다.

11111101 > 11111100     -2  > -3 

하지만, 1의 보수법도 여전히 0 의 표현이 두 가지로 존재하고 계산 과정에서
캐리를 감지해서 LSB(최하위 비트)에 더해주는 작업이 필요합니다.

예를 들어,
(-2) + (-3) 은 다음과 같이 되는데


이것을 그대로 사용하게 되면 -6 의 값이 되지만
캐리가 발생하였으므로 LSB 에 1을 더해서 다음과 같이 처리하게 됩니다.
(캐리 발생은 8086 계열의 CPU 의 경우 flag register 의 0번 비트를 보고 판별합니다.)


3. 1의 보수법 다음으로 1의 보수법이 가진 문제점이 개선되어 나온 것이 2의 보수법 입니다.
2의 보수법은 1의 보수를 취한 후에 단순히 1을 더해줌으로써 음수를 표현합니다.

(-2) + (-3)



0 의 표현



이렇게 함으로써 얻게된 잇점은

  • 0 에 대한 표현이 하나로 줄어들고 해당 비트 영역에서 표현 가능한 수가 1 늘어 납니다.
  • 캐리를 신경쓰지 않아도 됩니다.
  • 음수의 뺄셈을 감산기를 이용하지 않고 덧셈으로 처리할 수 있습니다.


'Short Articles' 카테고리의 다른 글

Class Template  (0) 2012.04.07
Function Template  (0) 2012.03.31
C++ Template, Expression Templates #4  (2) 2012.02.22
C++ Template, Expression Templates #3  (0) 2012.02.21
C++ Template, Expression Templates #2  (0) 2012.02.17
:

C++ Template, Expression Templates #4

Short Articles 2012. 2. 22. 20:05
표현식 템플릿은 숫자 배열 클래스를 지원하기 위해 고안된 프로그램이 기술입니다
이번 아티클은 다음과 같이 진행합니다
1. 단순한 배열 클래스 구현하여 배열 연산에 대한 문제제기
2. 표현식 템플릿 구현
3. 표현식 템플릿을 아는 랩퍼클래스 구현
4. 실재 표현식 템플릿 사용해서 어떻게 동작하는 방법 추적  
전체 표현식을 다 읽기 전에는 표현식의 일부만 계산하지 않고 전체 계산하기전에 어떤 객체에 무슨 연산이 적용되었는지 기록하는 것이 표현식 템플릿의 핵심입니다

 첫시간에 SArray 단순 배열 클래스를 만들었습니다
두번째에 A_Add, A_Mult, A_Scalar에 대해서 배웠습니다
(스칼라 때문에 A_Traits 이라는 특질클래스도 배웠습니다)
세번째에 Array 클래스와 연산자 배웠습니다

처음으로 돌아가서 배열 연산을 해봅시다

이 연산 부터 알아봅시다
1.2*x
연산자 오버로딩 중에 스칼라와 배열 곱셈연산이 호출됩니다

지저분 하네요 --; 이전에 설명 했습니다
템플릿 인자 추론(template argument deduction)이 되네요
operator* 의 Parameters : Arguments 로 구분하면
T const& s                :               1.2
Array const& b           :               x
T는 double 이고 R2는 SArray
double const& s , Array const& b 입니다
리턴타입
Array<T,A_Mult<T,A_Scalar<T>,R2> > 은  A_Scalar<T>와 R2 곱셈연산 결과를  A_Mult<T,A_Scalar<T>,R2> 가지고 있고 다른 곱셈 및 덧셈에 연산하기 위해 Array 래퍼클래스에 담고 있습니다
해당 객체를 생성자 리턴하는 아주 간결한(?) 코드 입니다
그러니까 A( B(c,d) ) 이런 구문이라고 할까요?
A객체를 생성하려면 B객체를 필요하고 B객체를 생성하려면 c,d 가 필요한경우 입니다

Array<...>(...) 결국 껍데기는  Array 이거이죠. 생성자를 호출한 코드입니다
Array<T,A_Mult<...> >(A_Mult<...>(...) ) Array에 실재 저장 하는 배열클래스를 넣어야 합니다 Array 생성자에 인수가 넣어야 하잖아요 그럼 Array는 끝났습니다 그런데  A_Mult가 남았네요 A_Mult 생성자를 넣어야 합니다
Array<T,A_Mult<T,A_Scalar<T>,R2> >(A_Scalar<T>(s), b.rep())); 그래서 이렇게 나왔습니다

 x*y
두 배열의 곱셈연산이 호출됩니다

이 연산도 설명해드려야 하는 거죠?? ㅡㅡ;
인자추론을 하면
Array<T,R1> const& a   :   x
Array<T,R2> const& b   :   y
T는 double 이고 R1는 SArray R2는 SArray 입니다
두 배열간 곱셈 연산도 생성자 호출인데요 
A( B(c,d) ) 이런형식 입니다
 
1.2*x + x*y
더하기 입니다

이것도 동일합니다 인자추론하면 어떨까요?
Array<T,R1> const& a    :     1.2*x  타입은  Array<double, A_Mult< double ,A_Scalar< double >,SArray> >
Array<T,R2> const& b    :      x*y  타입은   Array< double , A_Mult< double , SArray , SArray > >
T는 double이고 R1는  A_Mult< double ,A_Scalar< double >,SArray> , R2는  A_Mult< double , SArray , SArray > 입니다

리턴타입은   Array<double, A_Add<double,  A_Mult< double ,A_Scalar< double >,SArray> ,
   A_Mult< double , SArray , SArray > > >입니다

겁나 거대한 클래스가 만들어졌습니다
어떤 객체에 무슨 연산이 적용되었는지 기록 한 객체가 만들어 졌습니다
이제 실제 연산을 해봅시다
x = 1.2*x + x*y 

 Array의 할당연산자는 이렇게 구현되어 있었습니다

반복문을 돌면서 할당하고 있습니다
[]연산자를 사용하고 있네요 A_Add 에서는

 op1[idx] + op2[idx]
op1 은 A_Mult< double ,A_Scalar< double >,SArray>
op2 는 A_Mult< double , SArray , SArray >
[] 연산자를 사용합니다 A_Mult 에서는

이렇게 됩니다
Array의 할당 연산이 배열크기만큼 할당을 하며,
A_Add, A_Mult 의 [] 연산이 자신들이 저장하고 있는 배열의 계산을 해버립니다
실질적으로 이런연산이 됩니다

발표자료 올립니다
버전업 되었습니다



'Short Articles' 카테고리의 다른 글

Function Template  (0) 2012.03.31
음의 정수의 표현, 보수법  (1) 2012.02.27
C++ Template, Expression Templates #3  (0) 2012.02.21
C++ Template, Expression Templates #2  (0) 2012.02.17
C++ Basic Concept, Storage Duration  (0) 2012.02.10
:

C++ Template, Expression Templates #3

Short Articles 2012. 2. 21. 22:50
표현식 템플릿은 숫자 배열 클래스를 지원하기 위해 고안된 프로그램이 기술입니다
이번 아티클은 다음과 같이 진행합니다
1. 단순한 배열 클래스 구현하여 배열 연산에 대한 문제제기
2. 표현식 템플릿 구현
3. 표현식 템플릿을 아는 랩퍼클래스 구현
4. 실재 표현식 템플릿 사용해서 어떻게 동작하는 방법 추적

전체 표현식을 다 읽기 전에는 표현식의 일부만 계산하지 않고 전체 계산하기전에 어떤 객체에 무슨 연산이 적용되었는지 기록하는 것이 표현식 템플릿의 핵심입니다 

첫시간에 SArray 단순 배열 클래스를 만들었습니다
A_Add, A_Mult, A_Scalar에 대해서 배웠습니다
(스칼라 때문에 A_Traits 이라는 특질클래스도 배웠습니다)

이것을 가지고는 표현식 템플릿을 할 수 없습니다
이 표현식 템플릿을 알고 있는 랩퍼클래스 Array 만들어야 합니다

template <typename T, typename Rep = SArray<T> >
class Array;

Array가 값을 저장하는 실제 배열일 경우 SArray가 되며 A_Add나 A_Mult처럼 표현식을 나타낼 경우에는 중첩된 템플릿 식별자가 될 수도 있다

많은 연산들이 Rep 객체에 전달되기만 한다

이제 연산자를 구현해보자 이제부터 어려운 부분 시작입니다 정신을 똑바로 차리시고 코드에 집중해 주세요
두 배열의 덧셈입니다

복잡합니다 ㅠㅠ
템플릿
template <typename T, typename R1, typename R2>
T는 자료형이고요 R1, R2는 실제 배열클래스입니다 여기서는 SArray가 되겠죠?

리턴타입은 Array<T,A_Add<T,R1,R2> >
Array인데 자료형은 T이고 실재저장형은 A_Add<T,R1,R2> 인데
이것은 A_Add<T,R1,R2>은 R1,R2 저장한 결과 담고 있는 배열 이라고 생각해도 된다고 했죠
실재 저장한것이 아니라 R1과 R2 객체에 덧셈연산을 적용되었다고 기록하는 것입니다
앞서 말씀드렸지만 [] 연산자를 호출할때 그때 저장해서 값을 리턴합니다
하지만 여기서 수식이 복잡해지므로 우선 저장한 결과를 담은 배열이라고 생각합시다

함수명 operator+ 연산자 오버로딩 했습니다 C++ 기본 기능

함수인자
Array<T,R1> const& a
Array<T,R2> const& b
앞서 말씀드렸지만 R1, R2는 실제 저장 배열클래스입니다 여기서는 SArray 타입입니다
a는 자료형 T 실재배열 클래스 R1 값을 가지고 있는 레퍼클래스 Array의 객체 입니다
b도 마찬가지 입니다

리턴문 Array<T,A_Add<T,R1,R2> > (A_Add<T,R1,R2>(a.rep(),b.rep()));
가장 난해하면서 핵심 입니다
먼저 A_Add<> 객체를 생성 합니다
A_Add<T,R1,R2>(a.rep(),b.rep())
a.rep() 실재 저장된 배열 클래스를 반환하는 연산자 입니다
A_Add<T,R1,R2> 는 클래스 명이고요 
A_Add<T,R1,R2>(a.rep(),b.rep())은  A_Add<T,R1,R2>클래스의 생성자 호출 입니다
그 다음에 리턴 타입 객체를 생성합니다
Array<T,A_Add<T,R1,R2> > 은 클래스 명 입니다
Array<T,A_Add<T,R1,R2> > (A_Add<T,R1,R2>(a.rep(),b.rep()))은 클래스 생성자 호출 입니다
템플릿이 들어가서 한눈에 알아보기가 힘들지만 어쨌든 생성자를 호출해서 리턴 합니다
Array를 리턴타입으로 사용하는 이유는  Array객체로 래핑해 배열의 데이터를 나타내는  다른 객체와 같이 사용할 수 있게 하는 것입니다
리턴된  Array<T,A_Add<T,R1,R2> > 객체가 다른 Array객체와  operator+ 연산이 가능해 집니다

다음은 배열 곱셈연산입니다

배열 덧셈연산과 동일한 과정을 거치므로 설명을 생략합니다
다음은 스칼라와 배열 곱셈 입니다

자~ 설명 들어갑니다 
템플릿
 template <typename T, typename R2>
T는 자료형, R2는 실재 저장 배열 클래스 여기서는 SArray 입니다

리턴타입 Array<T, A_Mult<T,A_Scalar<T>,R2> >
Array 인데 T는 자료형  A_Mult<T,A_Scalar<T>,R2> 저장배열
A_Mult<T,A_Scalar<T>,R2>는 A_Scalar<T>와 R2를 곱한 결과를 담는 배열
A_Scalar<T> 는 모두 같은 값이 배열 이고요

함수명 operator* 연산자 오버로딩

함수인자
T const& s 평범한 값
Array<T,R2> const& b R2를 실재 저장클래스로 갖고 있는 레퍼배열 클래스

리턴값 Array<T,A_Mult<T,A_Scalar<T>,R2> > (A_Mult<T,A_Scalar<T>,R2>(A_Scalar<T>(s), b.rep()));
먼저 s를 스칼라로 변경합니다
A_Scalar<T>(s) 스칼라 생성자 호출
두 배열을 곱셈 합니다
A_Mult<T,A_Scalar<T>,R2> 클래스 형
A_Mult<T,A_Scalar<T>,R2>(A_Scalar<T>(s), b.rep() ) 생성자 호출
리턴타입  Array<T,A_Mult<T,A_Scalar<T>,R2> >  
Array<T,A_Mult<T,A_Scalar<T>,R2> > (A_Mult<T,A_Scalar<T>,R2>(A_Scalar<T>(s), b.rep()));  생성자 호출
리턴된 Array<T,A_Mult<T,A_Scalar<T>,R2> > 객체는 다른 Array객체와 연산이 가능해 집니다

다음번은 실재 값을 사용해서 효율적인지 확인 해보겠습니다
 
: