何时在c ++中使用void *

时间:2013-06-26 21:28:10

标签: c++ pointers syntax

我试图将我的头脑包裹在void*以及它的适当用途,如果有任何可能滥用的话,我应该知道。 (意思是冷静,没有错)。

我不明白如何以及为何使用void*。如果我理解,我需要将当前指针强制转换为void*,然后在我想使用时将其转换回原始指针...?

为什么这有益?不要使事情变得通用,因为我需要知道传递了什么类型的void*来进行演员......

任何人都可以帮助我理解void*

2 个答案:

答案 0 :(得分:12)

C 中,使用void *来创建泛型集合是相当常见的。例如,如果您想要一个通用链表,您可以编写类似的内容:

typedef struct node  { 
    void *data;
    struct node *next;
} node;

然后,您可以创建一个foo的链接列表,另一个bar的链接列表,依此类推。

但是,在C ++中,这很少有用。在典型情况下,您需要将等效代码编写为模板:

template <typename T>
class node { 
     T data;
     node *next;
};

使用较旧的编译器,您可以通过组合这两种技术来减少生成的代码。在这种情况下,您将使用指针集合来存储数据,然后有一个模板前端,当您执行T *void *时存储数据,并在您检索数据时从void *返回T *

编译器/链接器的改进使得这种技术(几乎?)完全过时了。较旧的编译器会为您实例化模板的每种类型生成单独的代码,即使实例化类型不相关也是如此。当前的编译器(或工具链,无论如何 - 相当一部分是由链接器真正处理的)识别相同的代码序列,并自动将它们合并在一起。

结论:除非您需要C兼容性,或者您正在编写替换operator new / operator delete,否则在编写良好的C ++中使用void *通常非常罕见。

答案 1 :(得分:2)

void*是没有类型的内存地址。当它周围的代码有其他方式知道它正在使用什么类型时(例如,memchr除了地址之外还需要传递内存区域的大小),这很有用。