나를 위해 포인터는 C++의 프로그래밍 언어 중 가장 어려운 개념 중 하나였습니다. C++을 배울 때, 나는 그것을 배우는 데 엄청난 시간을 보냈습니다. 그러나 이제는 C#, VB.NET 등의 언어로 작성된 프로젝트에서 주로 작업합니다. 사실 사실 C++에 거의 4 년 동안 손을 대지 않았습니다. 비록 C#은 포인터를 가지고 있지만, C#에서 포인터를 사용해야하는 상황에 적응하지 못했습니다. 그래서 내 질문에, 우리는 C#에서 포인터를 사용하여 어떤 종류의 생산성을 얻을 수 있습니까? 포인터의 사용이 필요한 상황은 무엇입니까?C#의 포인터와이 포인터가 응용 프로그램에서 얼마나 자주 사용됩니까?
답변
개인적으로 필자는 .NET에서 포인터를 사용할 필요가 없었지만 중요한 성능 핵심 코드를 다루는 경우 포인터를 사용했습니다. System.String 클래스를 살펴보면 문자열 조작을 처리하는 많은 메소드가 포인터를 사용한다는 것을 알 수 있습니다. 또한 이미지 처리를 할 때 포인터를 사용하는 것이 매우 유용합니다. 이제는 이러한 종류의 응용 프로그램이 .NET에서 처음으로 작성되어야하는지 (필자는 생각해야한다고) 분명히 주장 할 수 있지만, 적어도 여분의 비트 속도를 짜내 야하는 경우에는 할 수 있습니다.
저는 개인적으로 C#에서 포인터를 사용할 필요가 없었습니다. 그런 종류의 기능이 필요한 경우 C++/CLI에서이 코드를 작성하고 C#에서 호출합니다. C#에서 C++/CLI로 또는 그 반대로 포인터를 전달해야한다면 IntPtr으로 전달하고 C++/CLI에서 필요한 유형으로 변환하십시오.
내 의견으로는 - C#에서 포인터를 사용하는 경우 99 %의 경우에 잘못된 언어를 사용하고있는 것입니다.
편집 : C++/CLI의 좋은 점은 네이티브 전용 컴파일을 위해 개별 클래스를 표시 할 수 있다는 것입니다. 나는 매우 빨리 일어날 필요가있는 이미지 처리 작업을 많이합니다. 그것은 많은 포인터 기반 코드를 사용합니다. 일반적으로 관리되는 C++/CLI 객체는 내 처리가 이루어지는 네이티브 C++ 객체로 전달됩니다. 해당 기본 코드 및 비올라에 대한 최적화를 설정하면 성능이 향상됩니다.
부여됩니다. 네이티브 최적화 코드를 실행하여 얻을 수있는 성능 향상이 관리되지 않는 전환의 오버 헤드를 상쇄 할 수있는 경우에만 문제가됩니다. 내 경우에는 항상 그렇습니다.
주로 포인터를 사용하는 경우는 드문 경우지만 바이트 배열을 구조체로 변환해야하는 데이터를 보내거나받는 것과 관련이 있습니다. 그렇더라도 포인터를 직접적으로 처리 할 필요는 없습니다.
마샬 러에서 포인터를 사용하여 데이터에 액세스하기 위해 메모리를 복사해야하는 경우가 있으므로 포인터를 사용하여 성능을 향상시킬 수 있습니다 (Bitmap.Lock()
).
좋은 지적 - 바이트 배열에 대한 /에서 구조를 내 깜짝 깜빡. –
최근 응용 프로그램에서 변환 코드를 살펴 봤는데 포인터도 사용하지 않았습니다. 단지 GCHandle 만 사용했습니다. 그러나 때로는 그러한 경우 데이터를 다룰 때 고정 된 것이 필요합니다. – OregonGhost
포인터처럼 보이지 않는다는 점을 제외하면 이미 C#에서 많은 포인터를 사용하고 있습니다. 클래스의 인스턴스로 무언가를 할 때마다 포인터가됩니다. 귀찮은 일없이 이미 거의 모든 잠재적 이익을 얻고 있습니다.
C#에서 포인터를 더 명확하게 사용할 수 있습니다. 이는 대부분의 사람들이 C# 포인터를 사용하지만, 매우 드문 사례라고 생각합니다. 그것들은 C 라이브러리 등에 링크하는 데 유용 할 수 있지만 그 외에는별로 유용하지 않습니다.
Shiva는 원시 포인터에 대해 묻습니다. 기본적으로 위장의 포인터 인 객체 참조가 아닙니다. – OregonGhost
정확히 OregonGhost는 – Shiva
입니다. 그러나 Shiva는 왜 C++에서 그렇게 중요한지 궁금해하는 것처럼 보였습니다. 기음#. 대답의 일부는 좋은 C++ 프로그램이 포인터를 사용하는 대부분이 정확히 C# 및 Java와 Common Lisp 등이 오브젝트 참조 등으로 추상화되어 있다는 것입니다. 그렇기 때문에 C# 및 유사한 언어는 포인터 유형을 사용하지 않거나 적어도 일반적으로 사용되는 포인터 유형을 사용하지 않아 거의 기능을 잃지 않습니다. –
- 1. 포인터가 NSTimeInterval과 함께 사용됩니까?
- 2. C++ 응용 프로그램에서 얼마나 자주 srand()를 호출해야합니까?
- 3. PHP를 사용하는 직장에서 디자인 패턴이 얼마나 자주 사용됩니까
- 4. 라이센스를 얼마나 자주 확인합니까?
- 5. Event.RENDER가 얼마나 자주 호출됩니까?
- 6. EntityManager를 얼마나 자주 만들어야합니까?
- 7. 얼마나 자주 autoconf를 실행합니까?
- 8. 얼마나 자주 파일에 저장해야합니까?
- 9. GC는 얼마나 자주 실행됩니까?
- 10. 얼마나 자주 테이블 쿼리를
- 11. 얼마나 자주 코어 데이터에 저장해야합니까?
- 12. 응용 프로그램에서 크기가 얼마나 중요합니까?
- 13. 파이썬 장식자를 얼마나 자주 사용해야합니까?
- 14. 파이썬은 얼마나 자주 파일로 플러시됩니까?
- 15. 얼마나 자주 WSDL URL을 읽어야합니까?
- 16. 연속 통합 - 얼마나 자주 지속됩니까
- 17. 얼마나 자주 코드 검토를 수행해야합니까?
- 18. 얼마나 자주 Quartz Scheduler가 깨어나나요?
- 19. 얼마나 자주 QT에서 데이터베이스를 설정해야합니까?
- 20. 얼마나 자주 맞춤 이벤트를 사용합니까?
- 21. 데이터베이스 연결을 얼마나 자주 닫아야합니까?
- 22. Rx 프레임 워크가 웹 응용 프로그램에서 사용됩니까?
- 23. 대부분의 LOB 응용 프로그램에서 어떤 기술이 사용됩니까?
- 24. aspnetdb.mdf는 프로덕션 온라인 웹 응용 프로그램에서 사용됩니까?
- 25. 어떤 인증서가 smartclient 응용 프로그램에서 사용됩니까
- 26. 왜 Java 웹 응용 프로그램에서 직렬화가 사용됩니까?
- 27. 실제로 얼마나 많은 인덱스가 사용됩니까?
- 28. 래퍼 클래스가 제공하는 정적 메서드는 자주 사용됩니까?
- 29. Booksleeve 연결을 얼마나 자주 열고 닫아야합니까?
- 30. C의 배열은 포인터를 통해 사용됩니까? 질문에
이렇게하면 도움이 될 것입니다. C#의 참조, 포인터 및 주소 사이의 관계에 대한 약간의 의구심이 있습니다. http://blogs.msdn.com/ericlippert/archive/2009/02/17/references-are-not- addresses.aspx –