Việc thực hiện llvm::SmallVector<T,N>
được chia giữa nhiều loại:Tại sao llvm :: SmallVector chia bộ nhớ của nó?
llvm::SmallVectorBase
giữ 3void*
s cho bắt đầu, kết thúc, và năng lực.llvm::SmallVectorTemplateCommon<T>
giữ phần tử đầu tiên của bộ nhớ nhỏ, được sắp xếp phù hợp và có kích thước phù hợp với kích thướcchar
mảng.llvm::SmallVector<T,N>
giữ các phần tử tiếp theoN-1
của bộ nhớ nhỏ, dưới dạng một mảng phù hợp và có kích thước phù hợp và có kích thướcchar
mảng.
Tại sao sự phân chia lưu trữ giữa hai lớp mẫu, như trái ngược với có lớp có nguồn gốc nhất (SmallVector<T,N>
) chỉ đơn giản là lưu trữ tất cả các yếu tố N
và vượt qua trong con trỏ để lưu trữ này xuống lớp cơ sở? Đó là, nơi hiện nay các nhà xây dựng mặc định không:
SmallVector() : SmallVectorImpl<T>(N) { }
Một thực hiện giả thuyết khác nhau có thể làm:
SmallVector() : SmallVectorImpl<T>(&Storage, T * sizeof(N)) { }
và SmallVectorTemplateCommon
sẽ không có FirstEl
thành viên. Lợi thế của việc triển khai khi nó là gì?
Một 'SmallVector' không phải lúc nào cũng nhỏ, vì vậy bạn cần một cách để đưa con trỏ đến bộ nhớ nhỏ độc lập với 'bắt đầu'. Đó là thuận tiện có sẵn như '& firstEl'. –
@ T.C. Tại sao bạn cần nó? – Barry
Làm cách nào để bạn biết liệu vectơ có ở chế độ nhỏ không có nó (hoặc một số thông tin tương đương) không? –