Tôi đang cố gắng tạo một véc tơ loại bất khả tri trong C++ được phân biệt bằng hai thứ. Đầu tiên, nó phân bổ bộ nhớ trong chính đối tượng, ít nhất là cho đến một điểm nhất định, thay vì duy trì một mảng các đối tượng thực sự trên heap. Thứ hai, nó không thể sử dụng các bản sao chép/gán của C++, điều này dường như làm chậm mã và không cần thiết.Khi di chuyển/sao chép các cá thể đối tượng C++
Trong khi xem qua mã nguồn tôi duy trì trên máy tính của mình, tôi đã tìm thấy một lớp trong codebase của LLVM khá nhiều mô tả hoàn hảo những gì tôi đang tìm kiếm: SmallVector.h. Là tương đối mới đối với C++, tôi không hoàn toàn chắc chắn lý do tại sao một số quyết định thiết kế đã được thực hiện. Ví dụ: tại sao mảng được phân bổ theo điều khoản của U
thay vì T
? Nhận xét đưa ra một đầu mối:
Nếu T có một ctor hoặc dtor, chúng ta không muốn nó được tự động chạy, vì vậy chúng ta cần đại diện cho không gian như cái gì khác. Một mảng char sẽ hoạt động tốt, nhưng có thể không được căn chỉnh đầy đủ. Thay vào đó, chúng tôi sử dụng một số trường hợp công đoàn cho không gian, đảm bảo căn chỉnh tối đa.
U
, tất nhiên, đề cập đến sự kết hợp sau đây:
union U {
double D;
long double LD;
long long L;
void *P;
} FirstEl;
Vì vậy, tôi đoán, đây là những câu hỏi thật sự của tôi: Tại sao bố trí một mảng của T
ngụ ý rằng nhà xây dựng/hủy được gọi là? Có cách nào để di chuyển đối tượng C++ đối tượng xung quanh, tức là trong và ngoài của vector, mà không gọi những constructors/destructors? Tôi đoán tôi chỉ có thể sử dụng thực hiện SmallVector
LLVM của, nhưng tôi ghét sử dụng mã mà không hiểu nó.
nhất, Duane
'C++ 's sao chép/gán constructors, mà dường như làm chậm mã ...' Nó làm cho _correct_ mã, bởi vì họ _are_ cần thiết. Có một số lớp sẽ sụp đổ nếu chúng được bao giờ bị memcopied, và làm _not_ có một hàm tạo mặc định. –