2013-06-26 34 views
6

我正在试图包装我的头部void*以及它的适当用法,以及是否存在任何我应该了解的潜在滥用用途。 (意思是很酷,没有错)。何时在C++中使用void *

我不明白如何以及为什么要使用void*。如果我理解,我需要将我当前的指针投射到void*,然后在我想要使用它时将其转回原始位置......?

为什么这是有益的?不要让事情一般,因为我需要知道的是通过什么类型的void*在做投...

谁能帮助我了解void*

+0

C++通常有更好的选择,我知道这是我想到的一个特定的欺骗。 – chris

+3

在C++中,绝不会在非常特殊的情况下使用'void *'。 –

+1

这是*这些*功能之一。如果你不知道你是否需要它,你不需要它。 – delnan

回答

6

Ç这是相当普遍的使用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 *通常很少见。

+0

我建议对于那些最小可寻址单元为8位的平台使用'uint8_t *'而不是'void *'。在我看来,指向一个8位单元比指向没有任何东西更好。 –

1

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

相关问题