Tôi đang làm việc trên mã hiệu suất cao trong đó cấu trúc này là một phần của phần quan trọng về hiệu suất.Tạo chuỗi không an toàn từ char []
Đây là những gì xảy ra trong một số phần:
- Một
string
là 'quét' và siêu dữ liệu được lưu trữ một cách hiệu quả. - Dựa trên khối siêu dữ liệu này của chuỗi chính được tách thành
char[][]
. - Điều đó
char[][]
phải được chuyển thànhstring[]
.
Bây giờ, tôi biết bạn chỉ có thể gọi new string(char[])
nhưng sau đó kết quả sẽ phải được sao chép.
Để tránh bước sao chép thêm này xảy ra, tôi đoán có thể ghi trực tiếp vào bộ đệm trong của chuỗi. Mặc dù điều này sẽ là một hoạt động không an toàn (và tôi biết điều này mang lại rất nhiều tác động như tràn, tương thích về phía trước).
Tôi đã nhìn thấy một số cách để đạt được điều này, nhưng không có gì tôi thực sự hài lòng với.
Có ai có đề xuất đúng về cách đạt được điều này không?
Thông tin thêm:
Quá trình thực tế không bao gồm chuyển đổi để char[]
nhất thiết là nó thực sự là một 'đa chuỗi' hoạt động. Giống như 3 chỉ số và độ dài của chúng được nối thêm.
StringBuilder
có quá nhiều chi phí cho số lượng nhỏ các bản concats.
CHỈNH SỬA:
Do một số khía cạnh mơ hồ về chính xác những gì tôi yêu cầu, hãy để tôi cải cách nó.
Đây là những gì sẽ xảy ra:
- chuỗi chính được lập chỉ mục.
- Các phần của chuỗi chính được sao chép vào
char[]
. char[]
được chuyển đổi thànhstring
.
Những gì tôi muốn làm là hợp nhất bước 2 và 3, kết quả là:
- chuỗi chính được lập chỉ mục.
- Các phần của chuỗi chính được sao chép vào
string
(và GC có thể giữ bàn tay của nó ra khỏi nó trong quá trình bằng cách sử dụng thích hợp từ khóafixed
?).
Và một lưu ý là tôi không thể thay đổi kiểu đầu ra từ string [], vì đây là một thư viện bên ngoài, và các dự án phụ thuộc vào nó (tương thích ngược).
Bạn thực sự phải làm gì với các chuỗi sau tất cả điều này? Tức là, thay vì cố gắng tìm cách ánh xạ tới 'string []' mà không cần sao chép lại, bạn có thể đưa nó vào như một 'char []' và sau đó lưu trữ 'int, int' cặp vị trí và chiều dài của phụ tùng bạn cần, tham khảo các mảng ban đầu để kéo ra các chất nền bất cứ khi nào bạn cần chúng? –
Tôi không thực sự chắc chắn mã bạn đang cố gắng nâng cao ở đây. –
Lớp chuỗi là đặc biệt; nó là theo định nghĩa bất biến và liên quan đến việc sao chép. Cố gắng phá vỡ điều này là yêu cầu sự cố với GC và mã được quản lý khác (chuỗi được gộp chung). – Nikki9696