使用起来有很多缺点 void * 在 C 中(内存相关、类型相关、效率方面......)。尽管如此,我们还是经常使用它们,因为它们提供了灵活性。

列出使用的缺点/缺点 void * (以及 C 中的首选解决方案 - 如果可能)。

编辑:请访问以下链接:http://attractivechaos.wordpress.com/2008/10/02/using-void-in-generic-c-programming-may-be-inefficient/

有帮助吗?

解决方案

void 指针不存在效率问题。void 指针的唯一限制是:

  • 由于显而易见的原因,您无法取消引用 void 指针
  • sizeof(void) 是非法的
  • 不能对 void 指针执行指针算术

然而 GCC 假设 sizeof(void) 为 1 并且允许对 void 指针进行指针算术 - 看这里

其他提示

我不同意的问题的前提下。我们用void *在C,因为它得到多态性的唯一途径。例如:库函数的qsort和bsearch。只有一个缺点,它是基于无效多态性*是不安全的:一旦你将指针为void *,没有什么可以阻止你通过流延无效*的错误指针类型错误。我的学生犯这种错误经常。

有可以是效率成本,因为它有时是必要的,以使用一个多态数据结构分配堆空间。

如果谁希望看到与使用void *的多态数据结构应该得到大卫汉森的书的副本的优势和权衡的ç接口和实现

呃......我不知道有那么多。当然,你不应该使用void*当你不就得了。如果可以使用一个明确定义的类型,那么这样做。

在我的经验,void*是最好的“匿名”指针(震惊的!),在malloc()的返回值,而当刚刚处理的比特的不透明缓冲区。通常情况下,要解决在例如这些缓冲区字节级,然后你会使用unsigned char *,当然。

只是随机使用void*只要你需要一个指针将被刚刚打破,臭代码,并且要避免当然

在链接后与空指针与C ++模板的操作进行比较的操作,并得出结论认为模板是更有效的。这很难说是一个惊喜,我见过的C ++代码使用空指针很少或从来没有。它一般不提供优于其他C ++设施,并且可以是在类型系统中的漏洞。

然而,C不具有C ++ - 样式模板,和空指针是实现具有为独立的数据类型的功能必需的。

因此,当你用C正在编写的,你需要泛型,空指针是得到它(因为他们是唯一的手段)的最有效手段。当你用C ++编写,有更好的方式做几乎任何事情空指针可以完成,所以不要使用它们。

您给定的链路,部分是真实的。尤其是,当你不使用对象(结构)的交易,或者一般地与类型尚未分配。使用本机类型,如整型,双打等和空指针(如容器)几乎总是恶心的事,因为你要么选择铸INT(为双这不工作)的指针或需要分配额外的内存用于数据类型。

的第一选择是不好的,因为它不是便携式的,0是也许不允许作为一个值,并将其简单地感觉不好。因为额外分配的第二个选择浪费内存和确实是一个(块状)减慢。

但是在你不处理与原生类型,但使用对象,更好地与对象的指针,这是已经分配说大多数情况下,至少我是这样。我从来不需要一个哈希表或地图整数或双打。只为指针的类型safeness具有不同容器实现觉得我错了,因为每次执行会增加你的二进制文件的大小。所以,如果你只需要一个容器来存储您的指针,有使用空指针没有减慢或浪费内存。

但要注意,这是所有关于容器的实现,如BTW你提到的博客文章。一般有你不能在不使用空指针完成很多事情。

我不知道,我已经发现空指针是用于访问不同的抽象级别(的ABC)的非常有效的。如在不同的抽象级别的导航相通类的手段。它的那么简单,它的真棒。像公式E或黄金比例,应该有其崇拜空隙的隐匿*其那大:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top