我正在努力思考一个问题void*
我应该了解什么是正确的使用方式以及是否存在任何潜在的滥用行为。 (意思是很酷的东西,没有错)。
我不明白如何以及为什么使用void*
。如果我理解的话,我需要将当前指针转换为void*
然后当我想使用它时又投射回原来的...?
为什么这有好处?不要让事情变得通用,因为我需要知道什么类型void*
被传去参加选角……
谁能帮助我理解void*
In C这是相当常见的使用void *
创建一个通用集合。例如,如果您想要一个通用链表,您可以编写如下内容:
typedef struct node {
void *data;
struct node *next;
} node;
然后你可以创建一个链接列表foo
,另一个链表bar
, 等等。
然而,在 C++ 中,这很少有用。在典型情况下,您需要编写等效的代码作为模板:
template <typename T>
class node {
T data;
node *next;
};
对于较旧的编译器,您可以通过结合这两种技术来减少生成的代码。在这种情况下,您将使用指向 void 的指针集合store数据,然后有一个刚刚处理转换的模板前端T *
to void *
当您存储数据并从void *
to T *
当您检索数据时。
编译器/链接器的改进使得这种技术(几乎?)完全过时了。较旧的编译器会为实例化模板的每种类型生成单独的代码,即使实例化类型不相关。当前的编译器(或者工具链,无论如何——其中相当一部分实际上是由链接器处理的)识别相同的代码序列,并自动将它们合并在一起。
底线:除非您需要 C 兼容性,或者您正在编写替代品operator new
/operator delete
, 用于void *
写得好的 C++ 通常很少见。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)