2009-06-16 2 views
4

나를 위해 포인터는 C++의 프로그래밍 언어 중 가장 어려운 개념 중 하나였습니다. C++을 배울 때, 나는 그것을 배우는 데 엄청난 시간을 보냈습니다. 그러나 이제는 C#, VB.NET 등의 언어로 작성된 프로젝트에서 주로 작업합니다. 사실 사실 C++에 거의 4 년 동안 손을 대지 않았습니다. 비록 C#은 포인터를 가지고 있지만, C#에서 포인터를 사용해야하는 상황에 적응하지 못했습니다. 그래서 내 질문에, 우리는 C#에서 포인터를 사용하여 어떤 종류의 생산성을 얻을 수 있습니까? 포인터의 사용이 필요한 상황은 무엇입니까?C#의 포인터와이 포인터가 응용 프로그램에서 얼마나 자주 사용됩니까?

+0

이렇게하면 도움이 될 것입니다. C#의 참조, 포인터 및 주소 사이의 관계에 대한 약간의 의구심이 있습니다. http://blogs.msdn.com/ericlippert/archive/2009/02/17/references-are-not- addresses.aspx –

답변

2

개인적으로 필자는 .NET에서 포인터를 사용할 필요가 없었지만 중요한 성능 핵심 코드를 다루는 경우 포인터를 사용했습니다. System.String 클래스를 살펴보면 문자열 조작을 처리하는 많은 메소드가 포인터를 사용한다는 것을 알 수 있습니다. 또한 이미지 처리를 할 때 포인터를 사용하는 것이 매우 유용합니다. 이제는 이러한 종류의 응용 프로그램이 .NET에서 처음으로 작성되어야하는지 (필자는 생각해야한다고) 분명히 주장 할 수 있지만, 적어도 여분의 비트 속도를 짜내 야하는 경우에는 할 수 있습니다.

0

저는 개인적으로 C#에서 포인터를 사용할 필요가 없었습니다. 그런 종류의 기능이 필요한 경우 C++/CLI에서이 코드를 작성하고 C#에서 호출합니다. C#에서 C++/CLI로 또는 그 반대로 포인터를 전달해야한다면 IntPtr으로 전달하고 C++/CLI에서 필요한 유형으로 변환하십시오.

내 의견으로는 - C#에서 포인터를 사용하는 경우 99 %의 경우에 잘못된 언어를 사용하고있는 것입니다.

편집 : C++/CLI의 좋은 점은 네이티브 전용 컴파일을 위해 개별 클래스를 표시 할 수 있다는 것입니다. 나는 매우 빨리 일어날 필요가있는 이미지 처리 작업을 많이합니다. 그것은 많은 포인터 기반 코드를 사용합니다. 일반적으로 관리되는 C++/CLI 객체는 내 처리가 이루어지는 네이티브 C++ 객체로 전달됩니다. 해당 기본 코드 및 비올라에 대한 최적화를 설정하면 성능이 향상됩니다.

부여됩니다. 네이티브 최적화 코드를 실행하여 얻을 수있는 성능 향상이 관리되지 않는 전환의 오버 헤드를 상쇄 할 수있는 경우에만 문제가됩니다. 내 경우에는 항상 그렇습니다.

1

주로 포인터를 사용하는 경우는 드문 경우지만 바이트 배열을 구조체로 변환해야하는 데이터를 보내거나받는 것과 관련이 있습니다. 그렇더라도 포인터를 직접적으로 처리 할 필요는 없습니다.

마샬 러에서 포인터를 사용하여 데이터에 액세스하기 위해 메모리를 복사해야하는 경우가 있으므로 포인터를 사용하여 성능을 향상시킬 수 있습니다 (Bitmap.Lock()).

+0

좋은 지적 - 바이트 배열에 대한 /에서 구조를 내 깜짝 깜빡. –

+1

최근 응용 프로그램에서 변환 코드를 살펴 봤는데 포인터도 사용하지 않았습니다. 단지 GCHandle 만 사용했습니다. 그러나 때로는 그러한 경우 데이터를 다룰 때 고정 된 것이 필요합니다. – OregonGhost

3

포인터처럼 보이지 않는다는 점을 제외하면 이미 C#에서 많은 포인터를 사용하고 있습니다. 클래스의 인스턴스로 무언가를 할 때마다 포인터가됩니다. 귀찮은 일없이 이미 거의 모든 잠재적 이익을 얻고 있습니다.

C#에서 포인터를 더 명확하게 사용할 수 있습니다. 이는 대부분의 사람들이 C# 포인터를 사용하지만, 매우 드문 사례라고 생각합니다. 그것들은 C 라이브러리 등에 링크하는 데 유용 할 수 있지만 그 외에는별로 유용하지 않습니다.

+1

Shiva는 원시 포인터에 대해 묻습니다. 기본적으로 위장의 포인터 인 객체 참조가 아닙니다. – OregonGhost

+1

정확히 OregonGhost는 – Shiva

+1

입니다. 그러나 Shiva는 왜 C++에서 그렇게 중요한지 궁금해하는 것처럼 보였습니다. 기음#. 대답의 일부는 좋은 C++ 프로그램이 포인터를 사용하는 대부분이 정확히 C# 및 Java와 Common Lisp 등이 오브젝트 참조 등으로 추상화되어 있다는 것입니다. 그렇기 때문에 C# 및 유사한 언어는 포인터 유형을 사용하지 않거나 적어도 일반적으로 사용되는 포인터 유형을 사용하지 않아 거의 기능을 잃지 않습니다. –

관련 문제