2013-06-26 63 views
6

Tôi đang cố gắng quấn đầu về một số void* và sử dụng thích hợp nó là gì và nếu có bất kỳ việc sử dụng có khả năng lạm dụng nào tôi nên biết. (Có nghĩa là một cái gì đó mát mẻ, không sai).khi nào sử dụng void * trong C++

Tôi không hiểu cách thức và lý do sử dụng void*. Nếu tôi hiểu, tôi sẽ cần phải đưa con trỏ hiện tại của tôi đến một số void* và sau đó quay trở lại bản gốc khi tôi muốn sử dụng nó ...?

Tại sao điều này có lợi? Không làm cho mọi việc chung vì tôi cần phải biết những gì loại void* được thông qua năm làm diễn viên ...

bất cứ ai có thể giúp tôi hiểu void*

+0

C++ thường có các lựa chọn thay thế tốt hơn, và tôi biết có một bản dupe cụ thể mà tôi đang nghĩ tới. – chris

+3

Trong C++ không bao giờ sử dụng 'void *' mong đợi trong * rất * hoàn cảnh đặc biệt. –

+1

Đó là một trong những tính năng * đó *. Nếu bạn không biết nếu bạn cần nó, bạn không cần nó. – delnan

Trả lời

6

Trong C nó khá phổ biến để sử dụng void * tạo một bộ sưu tập chung chung. Ví dụ, nếu bạn muốn có một danh sách liên kết chung chung, bạn có thể viết một cái gì đó như:

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

Sau đó, bạn có thể tạo ra một danh sách liên kết của foo, một danh sách liên kết của bar, và vân vân.

Trong C++, tuy nhiên, điều này hiếm khi hữu ích. Trong trường hợp điển hình, bạn muốn viết mã tương đương làm mẫu thay thế:

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

Với trình biên dịch cũ hơn, bạn có thể giảm mã được tạo bằng cách kết hợp hai kỹ thuật. Trong trường hợp này, bạn sẽ sử dụng tập hợp con trỏ để hủy kích hoạt lưu trữ dữ liệu, sau đó có giao diện mẫu chỉ xử lý việc đúc T * đến void * khi bạn lưu trữ dữ liệu và quay lại từ void * đến T * khi bạn truy lục dữ liệu.

Cải tiến trong trình biên dịch/trình liên kết đã khiến kỹ thuật này (gần như?) Hoàn toàn lỗi thời. Các trình biên dịch cũ hơn sẽ tạo ra mã riêng biệt cho từng loại mà bạn đã khởi tạo mẫu của mình, ngay cả khi loại instantiation không liên quan. Các trình biên dịch hiện tại (hoặc các thanh công cụ, dù sao - một chút về điều này thực sự được xử lý bởi trình liên kết) xác định các trình tự mã giống hệt nhau và hợp nhất chúng lại với nhau một cách tự động.

Dòng dưới cùng: trừ khi bạn cần khả năng tương thích C hoặc bạn đang viết thay thế operator new/operator delete, sử dụng void * bằng văn bản C++ thường khá hiếm.

+0

Tôi khuyên bạn nên sử dụng 'uint8_t *' thay vì 'void *' cho những nền tảng có đơn vị địa chỉ tối thiểu là 8 bit. Theo ý kiến ​​của tôi, chỉ vào một đơn vị 8-bit là tốt hơn so với một con trỏ không có gì. –

1

void* là địa chỉ bộ nhớ không có loại. Nó hữu ích khi mã xung quanh nó có một số cách khác để biết loại nó đang làm việc với (ví dụ, memchr cần phải có kích thước của khu vực bộ nhớ được thông qua ngoài địa chỉ).

Các vấn đề liên quan