• [C/C++] 점점 더 암호문이 되어가는 C++112012.07.11 PM 08:35

게시물 주소 FONT글자 작게하기 글자 키우기

C++ 만든 사람이나 개정하는 사람들은 손가락 육체노동 보다
야시꾸리한 기호 해석하는게 더 좋은가 보다.

typedef 나 using, #define을 잘 써도 읽기가 참 어려운 듯....

원래의 C++ 문법도 좀 복잡하다 싶었는데, C++11을 보니 밀려드는 답답함....

아 ㅅㅂ 좋긴 좋은데, 뭐 이리 복잡하고 난해하지?


이제부턴 for 문을 보게 되면 일반 for 루프인지
아님 범위지정 for 루프인지를 한번 생각해야 하고, (자바에선 이미 하고 있다던가?)

[value](parameter)->return_type { 함수내용 }(parameter);

ㄴ 요렇게 생긴 문장을 보면 이게 lambda 함수 호출인지,
아님 functor 배열 중 하나의 원소 functor를 호출하면서
그 리턴되는 객체에다 멤버 접근 연산자 -> 쓴건지를 유심히 봐야되는구나......

아놔......



아래는 C++11에서 새로생긴 기능들중 일부임


----Lambda 함수

형식:
[母함수의 변수 캡쳐] (파라메터)->리턴타입 {함수내용...}

예 :
int a = 10;

auto Add_n_Cout = [&a] ( int b ){ //람다함수를 이름 붙여서 쓰려면 auto로 만들어야 함
a += b;
cout << a << endl;
};

Add_n_Cout ( 2 );
Add_n_Cout ( 3 );
Add_n_Cout ( 6 );
...


함수객체랑 비슷하게도 쓸 수 있고 바인딩 대신 쓰기에도 좋긴한데,
괄호기호랑 캡쳐기호(=,&) 난무로 인해 가독성 좆망....

눈 크게 뜨고 이게 배열기호인지 람다기호인지 구별해야 함

자바스크립트에서 봤던 function(){...} 이랑 비슷한 것 같은데,
굳이 이렇게 복잡해 보이는 구문으로 만들었어야 했던가....


ps. 나중에 람다함수의 호출규약을 어셈블리 레벨에서 구경해보고 싶음.



---- 형식 추론 decltype(), auto

위키피디아에 나와있는 예로 보면, 생각없이 써도 될 게 아니고, 이놈도 잘 써먹어야 될 듯....

#include
int main()
{
const std::vector v(1);
auto a = v[0]; // a has type int
decltype(v[0]) b = 1; // b has type const int&, the return type of
// std::vector::operator[](size_type) const
auto c = 0; // c has type int
auto d = c; // d has type int
decltype(c) e; // e has type int, the type of the entity named by c
decltype((c)) f = c; // f has type int&, because (c) is an lvalue
decltype(0) g; // g has type int, because 0 is an rvalue
}

아놔......상황에 따라 판단 잘 해야 되는구나 ㅅㅂ....졸라 복잡하네....

auto는 그냥 대입되는 r-value를 담을 수 있는 l-value 변수만 만드는 것 같고,

decltype() 은 괄호안의 객체를 담을 수 있을만한 객체 형식을 추론하는 거인듯....

근데 sizeof 처럼 typeof() 나 classof() 정도로 좀 더 직관적인 예약어로 해 주면 안되나.....




----R-Value 참조자

참조자 기호 & 대신 && 기호

R-Value를 참조 할 수 있는 모양이고, 기존 객체에
복사생성자 처럼 이동생성자를 만들수 있게 되어서
일반적인 복사대신 더 빠르게 데이터 이동을 가능케 한다고 함.(move sementics)

임시 값이나 고유값에 대한 참조자를 가질 수 있게 한다는건데,

근데 이게 있어야만 move sementics가 되는건지 잘 모르겠다. (포인터로 구현 하면 안되나...)



----std::unique_ptr : 스마트 포인터

auto_ptr 없어지고 unique_ptr 이라는 놈이 새로 생겨서 STL 컨테이너에서 쓸 수 있다길래
복사를 안하고 어떻게 쓰나 했더니, 복사생성자를 아예 막고, R-Value Ref 가지고 move 생성자를
도입한 듯...(컨테이너에 넣고 객체 이동은 가능하지만, 객체 복사를 시도하면 컴파일 오류 발생)

STL컨테이너에 넣을 땐 std::move() 로 넣어줘야 됨 (명시적으로 데이터 이동임을 표시)



---- std::array 배열 컨테이너

vector 보다 빠르지만 사이즈가 고정되어 있는 새로운 배열 컨테이너



---- std::unordered_set / std::unordered_multiset /std::unordered_map /std::unordered_multimap

해쉬테이블을 사용하는 새로운 set/map 컨테이너. (기존의 set / map은 R-B Tree)

원소가 많아지면 R-B Tree보다 빠르지만 정렬되지는 않는 컨테이너



---- 함수 반환값 후행선언 : 함수 선언문 뒤에 ->기호로 반환 형식 지정

auto GetIterator(파라메터)->std::vector::const_iterator
{ ...함수내용... }

이런식으로 반환형을 뒤에 적어준다는거 같은데, 가독성을 좋게하는 효과가 있는지 어떤지는 모르겠고,
객체 포인터에 멤버 접근 연산자랑 기호 중복됨...짜증남....

이거 잘못보면 무슨 객체포인터 쓰는거랑 헷갈리는거 아닐까....




---- 템플릿에 typedef 쓰는것 같은 효과 주는 using 키워드:

template
using Text = std::map;

아놔.......그냥 typedef로 하는게 보기 좋은것 같은데....using이라니.....

아직 vs2010에선 안되는 듯.....



---- 가변인자 템플릿

template
struct count {
static const int value = 1 + count::value;
}

template<> // 재귀의 끝
struct count<> { static const int value = 0;}

이렇게 선언해 놓고

count::value

이런 멤버를 얻으려고 하면 count -> count -> count -> count<>
이런식으로 같은 객체의 다른버전들이 계속 인스턴스화 되면서 value를 1씩 증가 시킨다.

요상한 재귀형 객체......신기하네....


---- 객체에 final 과 override등의 명시적 지시자 추가

final 지시자가 붙은 객체는 상속 불가
final 지시자가 붙은 멤버 함수는 오버라이딩 불가 함수로 지정
override 상속받은 객체에 있는 멤버를 오버라이드 한 것임을 명시함.(베이스 객체에 그 멤버가 없으면 컴파일 오류)

이건 좋은거 같음.


---- 객체 초기화 할 때 중괄호 사용

std::vector vec = {1,2,3,4,5,6,7,8,9};

요런게 가능하다는건데, VS2010에선 안됨
댓글 : 9 개
C** 공부 안한 나로썬 이글도 암호문
나도 한때는 C++로 먹고 살았는데 뭔말인지 모르겠다 ㅋ
오브젝트C에 있는 블럭코딩 비슷한게 도입 됬나 보네요. 이거 뒤게 편하던데
전 내츄럴만 써서.. C도 C만.. jquery도 안쓰고.. 알고리즘만 보고 자바스크립트로 고쳐쓰는.. ㅋㅋ
저런식의 템플릿어 쓰다보면 끝도 밑도 없어져요. 속도도 느려지고 다른 사람이 봐도 모르고..
C# 이 정답
람다함수는 블럭코딩이랑 비슷한게 맞는거 같네요. (전 ObjC를 안해봐서...)
코드 재사용도 좋고 템플릿도 참을만 하지만, GC가 간절하네요.
C#이나 Java로 가야하나....
회사에서 실무하는데 이런거 쓰면 욕 바가지로 먹음 ㅋㅋㅋ
아 뭐가 자꾸 생겨 언어 몇개씩 배우기도 짜증나 죽겠구만 ㅋㅋㅋㅋㅋ
엌ㅋㅋㅋㅋㅋ 이게뭐지
비동기, 지연 실행 등의 기법들이 이슈화가 많이 되다 보니 그걸 쉽게 처리하기 위한 부분들이랑, 정적 형식 제한이 많이 걸려 있다 보니 그거 극복하려고 이래저래 수를 쓰는 거 같네요. 관련 이슈들은 이전부터 말좀 있었던 걸로 압니다.

GC같은 경우는 OSX와 iOS 의 Obj-C 에선 있었는데, 속도 문제 등의 이슈가 많아서 iOS 5.0 SDK 이후에 ARC 로 바꿨습니다.
친구글 비밀글 댓글 쓰기