문제
사용하는 데 많은 단점이 있습니다 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 또는 황금 비율에 대한 공식과 마찬가지로, 공허를 숭배하는 오컬트가 있어야합니다.