我试图将我的头脑包裹在void*
以及它的适当用途,如果有任何可能滥用的话,我应该知道。 (意思是冷静,没有错)。
我不明白如何以及为何使用void*
。如果我理解,我需要将当前指针强制转换为void*
,然后在我想使用时将其转换回原始指针...?
为什么这有益?不要使事情变得通用,因为我需要知道传递了什么类型的void*
来进行演员......
任何人都可以帮助我理解void*
答案 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
除了地址之外还需要传递内存区域的大小),这很有用。