11

我正试图了解 avoid*以及它的适当用途以及是否有任何潜在的滥用用途我应该知道。(意思很酷,没有错)。

我不明白如何以及为什么要使用void*. 如果我理解的话,我需要将当前指针转换为 a void*,然后在我想使用它时再转换回原来的指针......?

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

谁能帮我理解void*

4

2 回答 2

13

Cvoid *中,用于创建泛型集合是相当普遍的。例如,如果您想要一个通用链表,您可能会编写如下内容:

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

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

然而,在 C++ 中,这很少有用。在典型情况下,您可能希望将等效代码编写为模板:

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

使用较旧的编译器,您可以通过结合这两种技术来减少生成的代码。在这种情况下,您将使用一组指向 void 的指针来存储数据,然后拥有一个模板前端,该前端仅处理存储数据时的转换,以及T *检索数据时的转换。void *void *T *

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

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

于 2013-06-26T21:41:26.310 回答
4

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

于 2013-06-26T21:44:52.947 回答