문제

사용하는 데 많은 단점이 있습니다 void * C (메모리 관련, 유형 관련, 효율성 현명한 ...)에서. 그들에도 불구하고 우리는 그들이 제공하는 유연성을 위해 많은 것을 사용합니다.

사용하는 단점/단점을 나열하십시오 void * (가능하면 C- 선호하는 솔루션).

편집하다:follwoing 링크를 살펴보십시오.http://attractivechaos.wordpress.com/2008/10/02/using-void-in-generic-c-programming-may-nefficial/

도움이 되었습니까?

해결책

무효 포인터에는 효율성 문제가 없습니다. 무효 포인터의 유일한 제한은 다음과 같습니다.

  • 명백한 이유로 공허 포인터를 피할 수는 없습니다
  • sizeof(void) 불법입니다
  • 무효 포인터에서 포인터 산술을 수행 할 수 없습니다

그러나 GCC는 그것을 가정합니다 sizeof(void) 1이고 무효 포인터에서 포인터 산술을 허용합니다. 여기를 봐

다른 팁

나는 질문의 전제에 동의하지 않습니다. 우리는 다형성을 얻는 유일한 방법이기 때문에 C에서 void*를 사용합니다. 예 : 라이브러리 기능 QSORT 및 BSEARCH 기능. 단점은 단 하나의 단점 만 있습니다. 이것은 void *를 기반으로 한 다형성이 안전하지 않다는 것입니다. 잘못된 실수로 포인터 유형. 내 학생들은 자주이 실수를합니다.

다형성 데이터 구조를 사용하기 위해 힙 공간을 할당해야하기 때문에 효율성 비용이 발생할 수 있습니다.

무효가있는 다형성 데이터 구조를 사용하는 장단점을보고 싶은 사람은 Dave Hanson의 책 사본을 받아야합니다. C 인터페이스 및 구현

어 ... 많은 것이 있는지 잘 모르겠습니다. 물론 사용해서는 안됩니다 void* 필요하지 않을 때. 잘 정의 된 유형이 있다면 사용할 수 있습니다.

내 경험상 void* "익명"포인터 (정말 충격!)에 가장 적합합니다. malloc()반환 값과 비트의 불투명 버퍼를 다룰 때. 종종, 당신은 예를 들어 바이트 레벨에서 해당 버퍼를 해결하고 싶고, 당신은 unsigned char *, 물론이야.

무작위로 사용합니다 void* 포인터가 필요한 곳이면 방금 파손되고 냄새가 나는 코드가 있으며 물론 피할 수 있습니다.

링크 된 게시물은 공간 포인터와의 작업을 C ++ 템플릿으로 작업과 비교하고 템플릿이 더 효율적이라고 결론을 내립니다. 이것은 놀라운 일이 아니며, 내가 본 C ++ 코드는 빈 공간 포인터를 거의 사용하지 않습니다. 일반적으로 다른 C ++ 시설에 비해 이점을 제공하지 않으며 유형 시스템의 틈새가 될 수 있습니다.

그러나 C에는 C ++ 스타일 템플릿이 없으며 데이터 유형과 무관 해야하는 기능을 구현하려면 무효 포인터가 필요합니다.

따라서 C로 글을 쓰고 일반적인 것이 필요할 때, void 포인터는 그것을 얻는 가장 효율적인 수단입니다 (유일한 수단이기 때문에). C ++로 글을 쓸 때는 거의 모든 공허 포인터가 달성 할 수있는 더 좋은 방법이 있으므로 사용하지 마십시오.

주어진 링크는 부분적으로 사실입니다. 특히, 객체 (structs)를 다루지 않거나 일반적으로 아직 할당되지 않은 유형을 처리 할 때. INT, 복식 등과 같은 기본 유형을 사용하면 int를 캐스팅 할 수있는 선택이 있기 때문에 (이중으로 작동하지 않음) 포인터 또는 포인터에 적용 할 수 있기 때문입니다. 데이터 유형에 추가 메모리를 할당해야합니다.

첫 번째 선택은 휴대용이 아니기 때문에 나쁘다. 0은 값으로 허용되지 않을 수 있으며 단순히 기분이 나쁘다. 두 번째 선택은 기억을 낭비하며 추가 할당으로 인해 실제로 (대규모) 속도가 느려집니다.

하지만 대부분의 경우 기본 유형을 다루지 않고 물체를 다루는 것이 더 나은 객체에 대한 포인터를 더 잘 말했습니다. 나는 정수 나 복식을위한 해시 테이블이나지도가 필요하지 않았습니다. 포인터의 유형 안전성에 대해서만 다른 컨테이너 구현을 갖는 것은 모든 구현이 이진 크기를 증가시키기 때문에 나에게 잘못된 느낌을줍니다. 따라서 포인터를 저장하기 위해 컨테이너 만 있으면 void-pointers를 사용하는 데 속도가 느려지거나 메모리 폐기물이 없습니다.

그러나 이것은 BTW와 같은 컨테이너 구현에 관한 것이 었습니다. 일반적으로 공극 포인터를 사용하지 않고 달성 할 수없는 많은 것들이 있습니다.

나는 Dunno, ABC (Aloid Pointers)가 다른 수준의 추상화 (ABC)에 액세스하는 데 매우 효과적이라는 것을 알았습니다. 다른 수준의 추상화에서 상호 연결된 클래스를 탐색하는 수단으로. 너무 간단하고 굉장합니다. E 또는 황금 비율에 대한 공식과 마찬가지로, 공허를 숭배하는 오컬트가 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top