2010-04-20 38 views
13

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 *

+6

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ừ đó. :-) –

Trả lời

5

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()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.)

+6

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

+0

@Mark: Tôi cũng đã nghe. – GManNickG

+1

@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

13

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ặc calloc hoặc new hoặc new[].
    • Nếu vậy, phải được chuyển đến free hoặc delete hoặc delete[] khi bạn hoàn tất.
    • Nếu có, các ký tự được lưu trữ trên heap.
  • 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.
  • 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ặc delete.
    • 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 được char*.
  • 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.
  • Thực hiện std::string::iterator loại với begin()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.
2

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.

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