2017-04-13 12 views
12

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ữ 3 void* 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ước char mảng.
  • llvm::SmallVector<T,N> giữ các phần tử tiếp theo N-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ước char 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)) { } 

SmallVectorTemplateCommon sẽ không có FirstEl thành viên. Lợi thế của việc triển khai khi nó là gì?

+0

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'. –

+0

@ T.C. Tại sao bạn cần nó? – Barry

+0

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? –

Trả lời

6

Tách lưu trữ tránh lưu trữ dung lượng nội tuyến (hoặc bit "nhỏ") trong loại "kích thước đã xóa" SmallVectorImpl.

SmallVectorImpl<T> có thể được sử dụng để tham chiếu bất kỳ SmallVector<T, N> và hỗ trợ tất cả các hoạt động vectơ trên đó. Khi lưu trữ cơ bản phát triển con trỏ không thể được chuyển đến free nếu nó sử dụng dung lượng nội tuyến. So sánh địa chỉ của bộ nhớ hiện tại với phần tử đầu tiên của công suất nội tuyến thuận tiện và tiết kiệm một chút bộ nhớ trong SmallVector.

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