我正在试图包装我的头部void*
以及它的适当用法,以及是否存在任何我应该了解的潜在滥用用途。 (意思是很酷,没有错)。何时在C++中使用void *
我不明白如何以及为什么要使用void*
。如果我理解,我需要将我当前的指针投射到void*
,然后在我想要使用它时将其转回原始位置......?
为什么这是有益的?不要让事情一般,因为我需要知道的是通过什么类型的void*
在做投...
谁能帮助我了解void*
我正在试图包装我的头部void*
以及它的适当用法,以及是否存在任何我应该了解的潜在滥用用途。 (意思是很酷,没有错)。何时在C++中使用void *
我不明白如何以及为什么要使用void*
。如果我理解,我需要将我当前的指针投射到void*
,然后在我想要使用它时将其转回原始位置......?
为什么这是有益的?不要让事情一般,因为我需要知道的是通过什么类型的void*
在做投...
谁能帮助我了解void*
在Ç这是相当普遍的使用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 *
通常很少见。
我建议对于那些最小可寻址单元为8位的平台使用'uint8_t *'而不是'void *'。在我看来,指向一个8位单元比指向没有任何东西更好。 –
void*
是一个没有类型的内存地址。当代码周围的代码有其他方式知道它正在使用哪种类型时(例如,memchr
除了地址之外还需要传递存储器区域的大小),这很有用。
C++通常有更好的选择,我知道这是我想到的一个特定的欺骗。 – chris
在C++中,绝不会在非常特殊的情况下使用'void *'。 –
这是*这些*功能之一。如果你不知道你是否需要它,你不需要它。 – delnan