새로운 C++ 표준 작업이 언제쯤에나 끝날지 고대하고 있는 분들에게
반가운 소식이 있습니다.
드디어 C++0x 작업이 거의 마무리 되었습니다.
저번 주 수요일에 최종 국제 투표가 끝난 후 드디어 결과가 나왔는데 ‘만장 일치로 승인’이 되었습니다. 이제는 앞으로 몇 달 후에 ISO로부터 최종 발행만 기다리면 됩니다(즉 서류적인 절차만 남았습니다).
이로써 길게 길게 진행된 C++의 새로운 표준 작업은 끝나게 되어서
이제 C++11로 불리게 되었습니다( 이전에는 C++98, C++03이 있었습니다 ).
C++은 특정 회사가 주도하지 않고,
기존에 C++로 만들었던 코드가 문제 없이 동작해야 하고(표준
사양만 지켰다면), 성능과 편리성을 모두 가지려고 하니 많은 시간이 걸렸습니다.
아직 ISO에서 최종 문서가 나오지 않았고 무료로 최종 사양이 어떻게
되었는지 궁금한 분들은 http://t.co/5mjCzyJ를 통해서 문서를 받아보기 바랍니다. 이 문서는 워킹 드래프트 3242로 ISO에서
나올 사양 문서와 거의 같을 것입니다(참고로 ISO에서 나온
문서는 유료입니다).
이제 우리는 앞으로 나올 Visual C++이 과연 얼만큼 새로운
표준 기능을 구현해 줄지가 기대됩니다. 개인적으로 꽤 많은 부분이 구현되리라 생각하고 혹 빠진 부분은
예전의 tr1처럼 서비스 팩에서 구현되지 않을까 생각합니다.
C++ 새로운 표준이 정해졌으니 남보다 앞서기를 바라는 C++ 프로그래머들은 새로운 C++ 표준을 공부해 봅시다. ^^
근래에 바빠서 글을 거의 올리지 못했는데 다음 글은 새로운 C++ 표준의
바뀐 부분을 간단하게 설명하는 글을 올릴 예정입니다.
그리고 새로 추가되는 표준 라이브러리는 boost 라이브러리에서 많이 들어왔습니다. 그래서 지금이라도 boost 라이브러리를 다운로드 받으면 새로운
표준에 들어갈 라이브러리를 미리 사용할 수 있습니다.
지금 D2D1을 공부중입니다.
혹시나 해서 질문을 올려보는데요.
RanderTarge->DrawBitmap();//해주고
RanderTarge->SetTransform();//을 해주면 비트맵이 변화가 되서 나옵니다. 그런데 이때 궁금 한점이 여러장의 비트맵을 생성했을 경우 DrawBitmap에는 각각의 비트맵을 선택해서 생성을 할수가 있는데 SetTransform은 일괄적으로 바껴버리네요 이걸 어떻게 해야하는건가요???
너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!
너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!
앞에까지는 STL의 알고리즘에 추가된 것들을 다루었는데 이번에는
컨테이너 하나를 소개하겠습니다. 사실 이 컨테이너는 저도 얼마 전까지만 하더라도 새로 추가 된지 몰랐습니다.^^;
새로 추가된 컨테이너의 이름은 ‘forward_list’입니다.
이름을 들어보니 대충 어떤 컨테이너인지 감이 오시죠?^^ 네
이 컨테이너는 기존의 list 컨테이너와 비슷한 종류의 컨테이너입니다.
forward_list를 만든 이유
표준 라이브러리(STL)에는 이미 리스트(std::list) 라이브러리가 있습니다. 이것은 쌍 방향 리스트입니다. list는 사용하기는 편하지만 사용 메모리나 처리 속도에 조금 아쉬운 점이 있습니다. 또 대 부분의 상황에서 쌍 방향 리스트가 필요한 경우보다는 단 방향 리스트만으로 충분한 경우가 자주 있습니다. 이런 이유로 C++0x에서는 단 방향 리스트를 추가하기로 했습니다.
forward_list의 설계 방침
1. 특별한 이유가 없다면 forward_list는 기존의 list의 설계에 맞춘다.
2. 설계 상의 선택 기가 여러 개인 경우 성능(속도와 사이즈)을 최우선 한다(C의 구조체로 구현하는 경우와 비교하여 Zero Overhead로 한다).
3. std::list의
insert와 erase를 forward_list에서도
제공할 수 있지만 구현이 복잡해지고 성능 측면에서 좋지 않으므로 제공하지 않는다.
4. 다른 STL의 컨테이너들에 있는 size 함수를
제공하지 않는다. 이유는 요소 수를 보존하는 멤버를가지고 있으면 C언어에서
구현한 것과 비교해서 불필요한 메모리를 사용한다. 만약 이런 멤버를 가지고 있지 않으면서 size 함수를 지원하면 호출할 때마다 모든 요소를 세어야 하므로 계산량이 O(N)이
된다(그런데 유저는 다른 컨테이너와 같이 size의 계산량이
작을 것이라고 생각할 수 있다). 또 이미 unordered와
같은 연상 컨테이너도 기존의 요소를 만족하지 않고 있다.
STL의 list 컨테이너와 다른 점
forward_list는 기존의 list와 아래와 같은 점이 다릅니다.
1. forward_list는 단 방향 리스트(singly-linked-list)이다. 각 요소는 그 다음 요소를
가리키는 포인터를 하나만 가지고 있다(list은 양 방향 리스트).
2. (단 방향 리스트이므로)
list에 비해서 메모리를 작게 사용한다. 이것은 각 요소의 메모리만이 아닌 컨테이너 그
자체의 사이즈도 작다. int 형에 대해서 list는 12바이트라면 forward_list는 8바이트이다(64비트에서는 각각
24, 16).
너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!
너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!
너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!
너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!
이번에 설명할 is_partitioned, partition_point는 그 이름처럼 앞서 소개한 partition_copy와 관계가 있는 알고리즘 입니다.
is_partitioned의 원형
template<class InputIterator, class BinaryPredicate>
bool is_partitioned(
InputIterator _First,
InputIterator _Last,
BinaryPredicate _Comp
);
partition_point의 원형
template<class ForwardIterator, class Predicate>
ForwardIterator partition_point(
ForwardIterator _First,
ForwardIterator _Last,
Predicate _Comp
);
is_partitioned는 데이터셋의 요소가 전반 부와 후반 부 두 개로 나누어져 있는지 조사할 때 사용하고, partition_point는 두 개로 나누어져 있는 데이터셋에서 후반 부의 첫 번째 요소를 가리키는 반복자를 반환합니다.
약간 설명이 애매하죠?^^;
예를 들어 설명하면 온라인 FPS 게임에서 8명이 각각 4명씩 레드 팀과 블루 팀으로 나누어서 게임을 하는 경우 vector로 된 StagePlayers(온라인 게임에서 방에 들어온 유저들을 저장)에 앞 부분에는 레드 팀 플레이어 4명을 차례로 저장하고, 그 이후에 블루 팀 플레이어를 저장하고 있는지 조사하고 싶을 때 is_partitioned 알고리즘을 사용하면 알 수 있습니다(맞다면 true를 반환합니다). 그리고 StagePlayers에서 블루 팀의 첫 번째 플레이어에 접근하고 싶다면 partition_point를 사용합니다.
나름 쉽게 설명한다고 했는데 이해 가시나요? 만약 이해가 안 간다면 예제 코드를 봐 주세요^^
< 예제 >
#include <iostream>
#include <algorithm>
#include <vector>
#include <list>
using namespace std;
struct PLAYER
{
int CharCD;
bool IsRedTeam;
};
int main()
{
vector< PLAYER > StagePlayers1;
PLAYER player1; player1.CharCD = 1;player1.IsRedTeam = true;StagePlayers1.push_back( player1 );
PLAYER player2; player2.CharCD = 2;player2.IsRedTeam = true;StagePlayers1.push_back( player2 );
PLAYER player3; player3.CharCD = 3;player3.IsRedTeam = true;StagePlayers1.push_back( player3 );
PLAYER player4; player4.CharCD = 4;player4.IsRedTeam = false;StagePlayers1.push_back( player4 );
PLAYER player5; player5.CharCD = 5;player5.IsRedTeam = false;StagePlayers1.push_back( player5 );
PLAYER player6; player6.CharCD = 6;player6.IsRedTeam = false;StagePlayers1.push_back( player6 );
PLAYER player7; player7.CharCD = 7;player7.IsRedTeam = false;StagePlayers1.push_back( player7 );
너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!
partition_copy 알고리즘은 하나의 집단에서 서로 다른 두 개의 집단으로 나눌 때 사용하는 것이라고 아주 간단하게 말할 수 있습니다.
partition_copy
template<class InputIterator, class OutputIterator1, class OutputIterator2, class Predicate>
pair<OutputIterator1, OutputIterator2>
partition_copy(
InputIterator _First,
InputIterator _Last,
OutputIterator1 _Dest1,
OutputIterator2 _Dest2,
Predicate _Pred
);
데이터셋의 _First와 _Last 사이에 있는 각 요소 x를 조건자 _Pred에 인자를 넘겼을 때 true를 반환하면 x는 _Dest1에, false를 반환하면 _Dest2에 복사하고 지정된 구간의 모든 요소를 다 처리하면 OutputIterator 값을 pair로 반환한다
그럼 좀 더 쉽게 이 알고리즘을 어떤 경우에 사용하는지 알 수 있도록 간단한 예제를 하나 보여드리겠습니다.
이번이 SafeInt 라이브러리에 대한 4번째 글이면서 마지막 글입니다. 이전 회의 제 글을 보셨다면 SafeInt가 어떤 것인지, 어떻게 사용하는지 대부분 알게 되셨습니다. 이번에는 SafeInt의 함수 버전에 대해서 설명합니다.
SafeInt 함수
SafeInt 라이브러리에는
SafeInt 클래스의 인스턴스를 만들지 않고 사용할 수 있도록 몇 개의 함수를 지원하고 있습니다.
SafeInt 함수는 정수 오버플로우가 발생하지 않도록 단일 수치 연산을 보호하고 싶을 때 사용합니다. 그리고 복수의 수치 연산을 보호하고 싶을 때는 SafeInt 클래스를
사용하고 함수 버전들을 반복하여 사용하는 것보다는 SafeInt 클래스를 사용하는 것이 더 효율적이라고
합니다.
<코드 1>의
결과를 보면 예외 처리에 의해서 프로그램이 크래쉬 되지 않음을 알 수 있습니다. 그런데 SafeInt를 사용할 때마다 <코드1> 처럼 매번 예외처리를 구현한다는 것은 너무 불편합니다. 불편하면 SafeInt를 기피하게 되겠죠. -_-
다행히 SafeInt는 이런 것도 다 감안해서 만들어져 있습니다. 사전에 예외처리를 미리 정의 해 놓으면 매번 예외처리를 정의할 필요가 없습니다.
SafeInt의 예외처리 정의는 두 가지 방법이 있습니다. 이번 회는 두 가지 방법 중 첫 번째 방법을 소개하고 두 번째 것은 다음 회에 소개 하겠습니다.
SafeInt의 예외처리 – 방법 1
SafeInt의 기본 예외 처리 클래스를 상속 받아서 우리가
원하는 방식으로 정의한 후 그것을 SafeInt의 생성자에 인자로 넘겨주면 SafeInt로 연산 작업을 할 때 예외가 발생하면 우리가 정의한 예외처리를 호출합니다. 백문이불여일견이라고 바로 다음의 코드를 봐 주세요. 아주 간단합니다.
< 코드 2.
SafeInt의 예외처리 방법 1 >
#include <iostream>
#include <safeint.h>
using namespace msl::utilities;
class MySafeIntException : public
SafeIntException
<코드 2>의
결과를 보면 SafeInt로 연산 작업을 할 때 예외처리를 같이 정의하지 않아도 오버플로우로가 발생하면
우리가 정의한 클래스의 멤버 함수를 호출 합니다.
SafeInt의 생성자에 인자로 넘기는 예외처리 클래스는 꼭
SafeIntException클래스를 상속 받고 static
void SafeIntOnOverflow()와 static void
SafeIntOnDivZero()를 재정의해야 합니다.
이것으로 <코드 1>의 예외처리 방식보다는 좀 편리해졌습니다. 그런데 아마 지금도
마음에 들지 않는 분이 있을 것 같습니다. SafeInt를 생성 할 때마다 매번 예외처리 클래스를 인자로
넘기는 것도 귀찮은 분이 있을 것 같네요. 이런 분들을 위해서
SafeInt는 또 하나더 예외처리 방법을 지원합니다. 그것은 다음 회에서 설명하겠습니다.^^
<코드1>를
실행하면 변수 X3와 BigX3의 값이 서로 같을까요? 혹시 같다고 생각하시는 분들은 unsigned int의 최대 값이
얼마인지 MSDN에서 검색해 보세요... 네 결과는 서로 다릅니다. 둘 다 계산에 사용하는 값은 같지만 결과가 다르게 나오는 이유는 unsigned
int로는 X1과 X2를 곱해서 나온 값을 보관할 수
없기 때문입니다. X3 = X1 * X2에서 X3는 오버플로우가
발생하여 상위 비트가 삭제되어 올바른 계산 값이 저장되지 않습니다.
<코드 1의
결과>
<코드 1>의
코드는 사실 별로 길지 않은 코드이기 때문에 실행하기 전에 오버플로우가 발생하리라는 것을 충분히 예상할 수 있고,
혹은 실행 후에 X3의 값이 예상하지 못한 값이 들어가 있어도 문제를 쉽게 파악할 수 있을
것입니다. 그러나 우리가 만드는 애플리케이션은 복잡하고 긴 코드를 가지고 있습니다. <코드 1>과 같은 오버플로우에 의해서 버그가 발생하면
쉽게 버그를 찾기 힘들고 특히 오버플로우에 의해 애플리케이션이 오 동작하여 크래쉬가 발생할 수도 있습니다.
안전한 애플리케이션을 만들기 위해서는 안전한 코드를 만들어야 합니다. 보통
안전한 코드를 생각하면 포인터 조작과 문자열 조작을 주로 중요하게 다루고 VC++에서도 안전한 문자열
조작 위해 ‘_s’가 붙은 문자열 조작함수를 사용하도록 VC++에서
종용하고 있어서 요즘은 대 부분 이것을 사용하고 있습니다. 그러나 정수 계산에 대해서는 안전한 코드를
위해 지원해 주는 것이 없었습니다.
SafeInt 란?
VC++ 10에서는 안전한 정수 계산을 위해서 새로운 라이브러리를
지원해 줍니다. 이 라이브러리의 이름은 SafeInt입니다. SafeInt는 C++의 템플릿으로 만들어서 char 형에서 __int64 형까지
8비트에서 64비트 사이의 크기를 가진 모든 정수 형을 사용할 수 있습니다.
SafeInt 라이브러리를 사용하면 결과를 담을 변수의 형 보다
큰 정수 값 연산을 하거나 0으로 나누기 연산을 할 때 발생하는 오버플로우를 감지 할 수 있습니다.
SafeInt 사용
SafeInt를 사용하기 위해서는 헤더 파일 safeint.h 를 포함하고 msl::utilities 이름 공간을
선언해야 합니다.
< 코드 2 >
#include <iostream>
#include <safeint.h>
using namespace msl::utilities;
int main()
{
SafeInt<unsigned
int> X1(1234567);
unsigned
int x2 = 1234567;
SafeInt<unsigned
int> X2(x2);
SafeInt<unsigned
int> X3 = X1 * X2;
getchar();
return
0;
}
<코드 2>를
디버그 모드에서 실행하면 아래와 같은 ASSERT 메시지가 발생합니다.
이유는 오버플로우가 발생했기 때문입니다. 그러나 릴리즈 모드에서는 ASSERT 메시지가 발생하지
않습니다. 다만 크래쉬가 발생합니다. -_-;;
오버플로우에 의해서 디버그 모드에서는 ASSERT 메시지, 릴리즈 모드에서는 크래쉬가 발생하는 이유는
SafeInt<unsigned int> X3 = X1 *
X2;
에서 예외가 발생하기 됩니다. SafeInt를 사용하는 경우
오버플로우가 발생하면 예외를 발생시키기 때문에 try{} catch{}로 예외를 처리해 주지 않으면
안됩니다. 예외 처리가 올바르게 하면 오버플로우가 발생했을 때 발생하는 문제를 올바르게 대처하던가 어디에서 어떻게 오버플로우가 발생했는지 쉽게 알 수 있습니다.
그리고 SafeInt는 일반 정수형과 같이 연산을 할 수도 있다.
<코드 3>
#include <iostream>
#include <safeint.h>
using namespace msl::utilities;
int main()
{
SafeInt<unsigned
int> X1(1234567);
unsigned
int X2 = 123;
SafeInt<unsigned
int> X3 = X1 * X2;
getchar();
return
0;
}
이번 회에는 간단하게 정수 연산 시의 오버플로우 문제와 SafeInt가
무엇인지, SafeInt의 간단한 사용 방법만 설명하였습니다.
그리고 이 라이브러리는 서버에서 사용하는 것을 생각했기 때문에 서버-클라이언트 연결과 서버-서버 연결을 가정하여 클라이언트 접속을 위한 Port와 서버 접속을 위한 Port 두 개를 생성합니다.
서버-서버 :: 서버 접속을 위한 Port
UINT16 ServerPort = configReader.GetValue<UINT16>(ACE_TEXT("server_port");
서버-클라이언트 :: 클라이언트 접속을 위한 Port
UINT16 ClientPort = configReader.GetValue<UINT16>(ACE_TEXT("client_port");
ACE는 정말 좋은 네트웍 프레임웍이지만 너무 범용적이라서 고도로
추상화 되었고, 기능이 다양하여 분석하기가 쉽지 않아서 사용에 어려움이 있습니다.
HalfNetwork는 javawork님이 다년간 온라인 게임 서버를
만든 경험을 바탕으로 서버 프로그램을 만들 때 필수적이고 자주 사용하는 기능을 쉽게 사용할 수 있도록 만든 것으로 서버와 클라이언트 용 둘 다
지원합니다. 그래서 ACE의 장점이 높은 성능과 다양한 기능, 멀티 플랫폼 지원을 이어 받으면서 아주 쉽게 서버 프로그램을 만들 수 있습니다(즉 ACE를 몰라도 괜찮습니다).
너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!
C++/CLI를 가장 자주 사용하는 경우가 아마 C++로 만든 코드를 닷넷에서 사용하고 싶을 때라고 생각합니다. 게임
개발에서는 보통 3D 툴을 만들 때 C++/CLI를 유용하게 사용합니다.
C++/CLI를 툴 개발에서 사용할 때는 보통 두 가지로 사용하는데
첫 번째는 C++로 만든 3D 엔진 코어를 DLL로 만들어서 C#을 이용하여 툴을 만들던가, 두 번째는 C++/CLI에서 관리코드와 비관리코드를 같이 사용할 때입니다.
제가 앞서 C++/CLI에 대해서 설명한 것들은 C++/CLI로만 프로그래밍 하는 것보다는 관리코드와 비관리코드를 같이 사용할 때를 생각하여 이때 필요로 하는
부분을 중심으로 했습니다. 그래서 아직 C++/CLI에 대한 많은
부분들이 빠져있습니다. 빠진 부분에 관심이 있는 분들은 C++/CLI
책이나 MSDN을 통해서 공부하시기 바랍니다.
앞으로 C++로 만든 코드를 C++/CLI를 사용하여 닷넷용 클래스 라이브러리를 만든 후 이것을 C#에서
사용하여 프로그램을 만든다는 경우로 간단한 프로그램을 만들면서 C++/CLI을 어떻게 사용하는지 몇 회에 걸쳐서 설명하겠습니다.
만들 프로그램은 네트웍 서버 애플리케이션입니다(제가 회사에서
맡은 직무가 온라인 게임 서버 개발입니다). ^^
네트웍 라이브러리(또는 프레임웍)
네트웍 프로그래밍은 일반적인 프로그래밍은 아니고 시스템 프로그래밍입니다. 조금은 특수한 분야라고 할 수 있습니다.
그러나 한국의 게임업계는 거의 대부분이 온라인
게임이라서 네트웍 프로그래밍이라는 것이 특수한 부분은 아닙니다.
보통 게임 프로그래밍이라는 것은 그래픽스 프로그래밍을 쉽게 떠올리고, 시중에
관련 책이나 학원들이 있습니다. 그러나 네트웍 프로그래밍에 관한 책이나 학원은 별로 없습니다(특히 전문 학원은 없는 것으로 알고 있습니다).
온라인 게임에서의
네트웍 프로그래밍을 한다라는 것은 대용량 네트웍 프로그램을 만들어야 한다는 것입니다. 그래서 온라인
게임 서버 프로그램을 만들려면 시스템 프로그래밍에 관한 지식과 네트웍 프로그래밍에 대한 경험이 필요합니다.
이런 이유 때문에 서버 프로그램을 만든다는 것은 쉽지 않습니다. 그러나
서버 프로그램을 쉽게 만들 수 있도록 도와주는 라이브러리를 사용할 수 있다면 어려움은 한층 작아질 것입니다.
위 코드 중 #pragma unmanaged 지시어 이하는 컴파일러에서
비관리코드로 취급합니다. 그리고 #pragma managed 이하는
관리코드로 취급합니다. 내용이 간단하고 어려운 부분이 없기 때문에 따로 자세한 설명은 생략하겠습니다.
C++/CLI는 단순하게 닷넷 플랫폼에서 사용할 수 있는 C++ 언어라기 보다는 C++ 언어의 부족한 부분을 진화 시킨 언어라고도
생각할 수 있는 부분이 꽤 있습니다. 그러나 C++/CLI는 C++과 C#의 중간의 애매한
위치에 있어서 양쪽 프로그래머 모두에게 별로 호응을 받지 못하는 것 같습니다. 그래서 C++/CLI 관련 글을 제가 처음에 생각했던 것보다는 조금 일찍 끝낼려고 합니다.
C++/CLI를 사용하는 대부분의 프로그래머들은 아마 기존의
비관리 코드를 관리코드에서 사용하고 싶을 때라고 생각합니다. C++/CLI의 기능 소개는 이번으로 일단 끝내고 앞으로는 비관리코드와의 연계에 대해서 실제 사례 보여주면서 설명하려고 합니다.
사례는 오픈 소스 네트워크 라이브러리인 HalfNetwork를
C++/CLI를 사용하여 관리코드에서 사용할 수 있도록 wrapping한
후 이것을 관리코드에서 사용할 예정입니다.
HalfNetwork는 온라인 게임 서버 프로그래머인 임영기님이
만든 것으로 ACE 라는 오픈 소스 네트워크 라이브러리를 사용하기 편하게 만든 라이브러리입니다.
댓글을 달아 주세요
내가? 그는 웹 사이트에 배포 꽤 제안을 발견으로 친구에게서 전화를 얻는 특권을 해요. 블로그 게시 주변 서핑하는 것은 일반적으로 정품 멋진 만남이다. 자신에 비해 어떤 측면에서 고객을 고려하고 많은 덕분에, 난 당신에게 전문 영역 것으로 승리와 관련된 최선을 열망.
려하고 많은 덕분에, 난 당신에게 전문 영
개인적으로 도서관에 와서 그것을 다운로드하여 직접 집에서 읽어 않고도 바로 거기에 책을 읽는 것을 선호합니다. 나는 도서관 상황은 조용하고 시원하고 편안한 사랑 해요.
감사의 뜻을 전달하기 위해, 우리는 특정 목표를 달성하기 위해 전세기 예약을 위해 신용 카드를 사용합니다. 그것은 고객이 제품을 구입하는 동기를 부여하실 수 있습니다.
이메일 마케팅은 회사와 클라이언트 간의 관계의 모든 측면을 측정할 수있는 유일한 기회입니다. 이메일 마케팅은 중요한 벡터 생성 웹 트래픽입니다. 판촉 모델의 상단 목록에서 많은 마케팅 이메일 마케팅 장소.
경력은 평범한 사람이 만족하는 무언가가 될 수 있습니다.성공 종래는 작업에서 볼 수 있습니다. 때때로, 사람들은 직업의 일부 형식을 무시합니다.
언어를 프로그래밍하는 것은 배울 매우 중요하는 것은 웹사이트를 개발하려는 것입니다. 그것은 처음에 매우 어려운 것입니다.
때때로 일이 일이 남자와 여자가 펄럭 다네.경력은 남성과 여성들이 더 많은 수업을 잘하고, 믿게 수 있습니다. 그럼에도 불구하고 작업의 품질과 남성과 여성 행복하게 그 일을해야합니다.
직업은 그 사람들이 자랑스러운 일이 될 수 있습니다.번영의 기준은 작업에서 볼 수 있습니다. 때때로, 사람들은 일자리 특정 종류의 과소 평가.