2010-02-01 39 views
23

Tôi biết một vài (tất cả?) STL triển khai thực hiện tối ưu "chuỗi nhỏ", thay vì lưu trữ 3 con trỏ thông thường để bắt đầu, kết thúc và dung lượng chuỗi sẽ lưu trữ dữ liệu ký tự thực trong bộ nhớ được sử dụng cho con trỏ nếu sizeof (ký tự) < = sizeof (con trỏ). Tôi đang ở trong một tình huống mà tôi có rất nhiều vectơ nhỏ với kích thước phần tử < = sizeof (con trỏ). Tôi không thể sử dụng mảng kích thước cố định, vì vectơ cần có khả năng thay đổi kích thước động và có khả năng phát triển khá lớn. Tuy nhiên, kích thước trung bình (không có nghĩa là) của vectơ sẽ chỉ là 4-12 byte. Vì vậy, một "chuỗi nhỏ" tối ưu hóa thích nghi với vectơ sẽ khá hữu ích cho tôi. Có một điều như vậy tồn tại?tối ưu hóa chuỗi nhỏ cho vector?

Tôi đang suy nghĩ về việc cuộn của riêng mình bằng cách đơn giản lực lượng vũ phu chuyển đổi vectơ thành chuỗi, tức là cung cấp giao diện vectơ cho chuỗi. Ý tưởng tốt?

+0

Câu hỏi của bạn không rõ ràng lắm. Hơn nữa, bạn có ý nghĩa gì với giao diện 'vectơ' đối với' chuỗi'? Bạn đang nói về một lớp 'svector' đặc biệt để giữ các chuỗi nhỏ? – dirkgently

+0

No. Tôi có nghĩa là một chuỗi giữ giá trị tùy ý thay vì các loại char - giống như một vectơ. Một giao diện vectơ tới một chuỗi có nghĩa là bao bọc đối tượng chuỗi và phơi bày một giao diện tương thích vectơ, thêm các hàm thiếu như push_back. – BuschnicK

+0

Bạn sẽ không thể làm điều gì đó với người cấp phát? Bạn sẽ không nhận được ngay cả 3 con trỏ giá trị bộ nhớ, vì vector cũng cần một cách để biết nếu nó đang ở chế độ "nhỏ" hoặc "lớn". – UncleBens

Trả lời

15

Bạn có thể mượn triển khai SmallVector từ LLVM. (chỉ tiêu đề, nằm trong LLVM \ include \ llvm \ ADT)

+5

Nó không còn là tiêu đề nữa. – rightfold

+0

tiêu đề ở đây: https://github.com/llvm-mirror/llvm/blob/master/include/llvm/ADT/SmallVector.h – Nick

1

Đó là discussed năm trước (và một vài tên trong chuỗi đó có thể trông hơi quen thuộc :-)), nhưng tôi không biết triển khai hiện có. Tôi không nghĩ rằng tôi muốn cố gắng để thích nghi std :: string cho nhiệm vụ. Các yêu cầu chính xác về loại mà trên đó std :: basic_string không được nêu rõ, nhưng tiêu chuẩn là khá rõ ràng rằng nó chỉ dành cho một cái gì đó hoạt động rất giống như char. Đối với các loại khác nhau đáng kể, nó có thể vẫn hoạt động, nhưng thật khó để nói điều gì sẽ xảy ra - nó không bao giờ được dự định, và có lẽ chưa được thử nghiệm với nhiều loại khác với số nguyên nhỏ.

Khi bạn bắt đầu, thực hiện std::vector từ đầu (thậm chí bao gồm tối ưu hóa véc tơ nhỏ) sẽ không quá khó khăn.

+11

Thực hiện 'std :: vector' * chính xác * từ đầu đáng ngạc nhiên là khó. Tất nhiên, nếu bạn chọn bỏ qua sự an toàn ngoại lệ, nó trở nên dễ dàng hơn nhiều, nhưng sau đó nó không còn là một triển khai thực hiện 'vector' có ý nghĩa (hoặc hữu ích) nữa. – jalf

+0

Cảm ơn con trỏ - tiếc là cuộc thảo luận chưa bao giờ thực sự đạt đến kết luận. Việc triển khai vectơ của riêng tôi sẽ không khó khăn lắm, tôi đồng ý. Tuy nhiên, tôi đã hy vọng chỉ cần cắm vào một số lớp học đã sẵn sàng và thấy hiệu quả về mức tiêu thụ bộ nhớ. Tôi hiện đang đùa giỡn với nhiều ý tưởng khác nhau về việc giảm lượng bộ nhớ của chúng tôi và đây chỉ là một trong số đó. – BuschnicK

+0

Khi điều đó được nói, tôi nghĩ một triển khai vector tùy chỉnh sẽ là cách tốt nhất để đạt được điều này. Việc gói lớp vectơ hiện tại sẽ làm cho khó khai thác kích thước của đối tượng một cách hiệu quả, và một vector tùy chỉnh không phải là khoa học tên lửa, miễn là bạn cẩn thận và biết bạn đang làm gì. – jalf

2

Nếu T là loại POD tại sao không basic_string thay vì vector ??

+1

Lưu ý rằng bạn phải viết chuyên môn 'std :: char_traits' (hoặc một loại đặc điểm tương đương) cho loại POD. Các yêu cầu không phải là tất cả những điều nghiêm trọng, ngoài việc cần phải chỉ định một giá trị 'eof' đặc biệt, nhưng tôi mong đợi nó khá tẻ nhạt. –

+0

Hơn nữa, không có đảm bảo rằng 'basic_string ' sẽ sử dụng tối ưu hóa chuỗi nhỏ, và không có cách di động để xác định có bao nhiêu phần tử, ngay cả khi có. –

19

Tăng 1.58 vừa được phát hành và thư viện Container có lớp học small_vector dựa trên LLVM SmallVector.

Ngoài ra còn có static_vector không thể phát triển vượt quá kích thước ban đầu đã cho. Cả hai vùng chứa đều chỉ có tiêu đề.

thư viện folly của facebook cũng có một số vùng chứa tuyệt vời.

Nó có một small_vector có thể được định cấu hình với thông số mẫu để hoạt động như các vectơ static hoặc small của boost. Nó cũng có thể được cấu hình để sử dụng các loại số nguyên nhỏ cho sổ sách kế toán nội bộ của nó mà cho rằng chúng là facebook không có gì ngạc nhiên :)

Có công việc đang tiến hành để làm nền tảng thư viện hỗ trợ Windows/MSVC ...