hiện std :: chuỗi lưu trữ dữ liệu khác với char * trên stack hoặc đống hoặc là nó chỉ bắt nguồn từ char * vào một lớp?std :: string vs. char *
Trả lời
Nếu bạn muốn nói, nó có lưu trữ liên tục không, thì câu trả lời là nó không bắt buộc nhưng mọi triển khai đã biết (với tôi, dù sao) đều làm như vậy. Điều này rất có thể hỗ trợ các yêu cầu thành viên c_str()
và data()
, để trả về một chuỗi liền kề (không được kết thúc bằng trường hợp c_str()
)
. Nhưng một số triển khai sử dụng "Tối ưu hóa chuỗi ngắn", nhờ đó nội dung chuỗi ngắn được lưu trữ trong bộ đệm nhỏ bên trong. Vì vậy, trong trường hợp đối tượng chuỗi nằm trên ngăn xếp, có thể nội dung được lưu trữ cũng nằm trên ngăn xếp. Nhưng điều này sẽ làm cho không có sự khác biệt về cách bạn sử dụng nó, vì một đối tượng bị phá hủy, bộ nhớ lưu trữ dữ liệu chuỗi bị vô hiệu trong cả hai trường hợp.
(btw, đây là an article on a similar technique applied generally, điều này giải thích việc tối ưu hóa.)
Ủy ban C++ 0x nhận thấy rằng tất cả các triển khai hiện tại lưu trữ liên tục, vì vậy họ quyết định củng cố ngôn ngữ và đưa ra yêu cầu. Xin lỗi tôi không có một tham chiếu để sao lưu nó lên. –
@Mark: Tôi cũng đã nghe. – GManNickG
@Mark Ransom: Điểm tốt, mặc dù điều đó sẽ chỉ áp dụng trong C++ 0x +; C++ 98/03 không có yêu cầu đó – dcw
char*
- là kích thước của một con trỏ cho kiến trúc CPU của bạn.
- Có thể là giá trị được trả lại từ
malloc
hoặccalloc
hoặcnew
hoặcnew[]
.- Nếu vậy, phải được chuyển đến
free
hoặcdelete
hoặcdelete[]
khi bạn hoàn tất. - Nếu có, các ký tự được lưu trữ trên heap.
- Nếu vậy, phải được chuyển đến
- Có thể là kết quả của "phân hủy" của mảng
char[ N ]
(hằng số N) hoặc chuỗi ký tự bằng chữ.- Về cơ bản, không có cách nào để cho biết điểm đối số
char*
có ngăn xếp, vùng heap hoặc không gian toàn cục hay không.
- Về cơ bản, không có cách nào để cho biết điểm đối số
- Không phải là loại lớp. Nó tham gia vào các biểu thức nhưng không có chức năng thành viên.
- Tuy nhiên, thực hiện giao diện RandomAccessIterator để sử dụng với
<algorithm>
và các loại tương tự.
std::string
- là kích thước của một vài gợi ý, thường ba.
- Tự xây dựng khi được tạo: không cần
new
hoặcdelete
.- Sở hữu bản sao của chuỗi, nếu chuỗi có thể bị thay đổi.
- Có thể sao chép chuỗi này từ
char*
. - Theo mặc định, sử dụng nội bộ
new[]
nhiều như bạn sẽ nhận đượcchar*
.
- Cung cấp chuyển đổi tiềm ẩn, giúp minh bạch việc xây dựng từ
char*
hoặc theo nghĩa đen. - Là loại lớp. Xác định các toán tử khác cho các biểu thức như là catenation.
- Xác định
c_str()
trả vềchar*
để sử dụng tạm thời.
- Xác định
- Thực hiện
std::string::iterator
loại vớibegin()
vàend()
.string::iterator
linh hoạt: triển khai có thể biến nó thành trình trợ giúp gỡ lỗi siêu an toàn được kiểm tra phạm vi hoặc chỉ đơn giản là một hiệu quả cực kỳ hiệu quảchar*
khi lật công tắc.
Giải quyết các vấn đề khác nhau. char*
(hoặc char const*
) trỏ đến chuỗi kiểu C không nhất thiết thuộc sở hữu của chuỗi lưu trữ con trỏ char*
. Trong C, vì thiếu loại chuỗi, nhất thiết bạn thường sử dụng char*
làm "loại chuỗi".
std::string
sở hữu dữ liệu chuỗi mà nó trỏ đến. Vì vậy, nếu bạn cần lưu trữ một chuỗi ở đâu đó trong lớp học của mình, rất có thể bạn muốn sử dụng std::string
hoặc lớp chuỗi của librarie thay vì char*
.
Khi tiếp tục lưu trữ std::string
, những người khác đã trả lời.
- 1. std :: string :: length() vs std :: string :: kích thước()
- 2. Performance std :: strstr vs std :: string :: tìm
- 3. std :: size_t vs size_t vs std :: string :: size_type
- 4. Chuyển đổi std :: string thành std :: vector <char>
- 5. std :: array <char, N> to std :: string
- 6. Gọi mơ hồ (chuyển đổi từ char * sang lambda vs std :: string)
- 7. C++ std :: string append vs push_back()
- 8. std :: di chuyển giữa std :: string và std :: vector <unsigned char>
- 9. Chuyển đổi từ const char * để std :: string const &
- 10. Sao chép tăng :: mảng <char> thành std :: string
- 11. std :: string hoặc std :: vector <char> để giữ dữ liệu thô
- 12. convert unsigned char * thành String
- 13. Char Mảng VS Char *
- 14. So sánh Char/String
- 15. std :: string :: c_str() và temporaries
- 16. Marshal.PtrToStringUni() vs new String()?
- 17. char * foo vs char * foo
- 18. Chuyển đổi std :: string thành số nguyên
- 19. thành ngữ đúng cho phân std :: string
- 20. std :: string :: assign() gây ra segfault
- 21. std :: string x (x);
- 22. return std :: string/std :: list from dll
- 23. boost :: ifind_first with std :: string objects
- 24. C Mảng # - string [] [] vs string [,]
- 25. String để char mảng Java
- 26. Nối một int vào một std :: string
- 27. sao chép không null-chấm dứt mảng char unsigned để std :: string
- 28. Tôi có thể giải phóng bộ nhớ của chuỗi char * khi gán nó cho std :: string?
- 29. Cách để nhận được unsigned char vào một std :: string mà không reinterpret_cast?
- 30. Làm thế nào để chuyển đổi unsigned char * thành std :: string in C++?
Con trỏ (và đặc biệt là 'char *') không phải là loại lớp và không thể bắt nguồn từ đó. :-) –