2016-02-25 17 views
5

Tại sao nó khả thi? Có hai chuỗi khác nhau "testString" nhưng kích thước vector được phân bổ chính xác.Khởi tạo vectơ với std :: bắt đầu và std :: kết thúc

#include <iostream> 
#include <vector> 
#include <iterator> 

int main() 
{ 
    std::vector<char> str; 
    str.assign(std::begin("testString"), std::end("testString")); 
    copy(str.begin(), str.end(), std::ostream_iterator<char>(std::cout, " ")); 

    std::cout<<str.size(); 

    return 1; 
} 
+0

Nếu bạn tìm thấy bất kỳ câu trả lời nào thỏa mãn, bạn nên [chấp nhận] (http://meta.stackexchange.com/a/5235/225842). – Antonio

Trả lời

9

Bạn đã may mắn và trình biên dịch thực hiện tối ưu hóa string pooling. Lưu ý rằng những gì bạn làm vẫn là hành vi không xác định và với trình biên dịch khác nhau hoặc cài đặt trình biên dịch khác nhau, bạn sẽ không được may mắn như vậy. Đừng làm như vậy nữa.

2

Hai chuỗi chữ giống hệt nhau có nhiều khả năng được kết hợp thành một bộ duy nhất trong bộ nhớ để bắt đầu và kết thúc tham chiếu đến cùng một chuỗi.

này chỉ hoạt động bằng cách 'tai nạn' trong chương trình của bạn mặc dù ...

Đây là một phần nào liên quan How Do C++ Compilers Merge Identical String Literals

2

Kể từ khi trình biên dịch được phép lưu trữ cùng một chuỗi đen được sử dụng ở vị trí khác nhau trong một nơi nhiều khả năng cả hai số std::begin("testString")std::end("testString") thực sự đang đề cập đến cùng một chuỗi.

Điều này không bắt buộc phải xảy ra theo tiêu chuẩn và trình biên dịch có thể lưu trữ cả hai chuỗi ký tự đó ở các vị trí khác nhau sẽ phá vỡ mã này. Chỉ vì nó đang hoạt động không có nghĩa là bạn nên làm điều này. Tôi sẽ đề nghị sử dụng

std::vector<char> str; 
const char [] chstr = "testString" 
str.assign(std::begin(chstr), std::end(chstr)); 

Hoặc tốt hơn

2

Có hai chuỗi khác nhau "testString"

Họ giống nhau ở trường hợp của bạn. Trình biên dịch được phép kết hợp dung lượng lưu trữ bằng hoặc chồng chéo string literals.

Trình biên dịch được phép, nhưng không bắt buộc, để kết hợp bộ nhớ cho các chuỗi ký tự bằng hoặc chồng chéo. Điều đó có nghĩa là các chuỗi ký tự giống hệt nhau có thể hoặc không thể so sánh bằng nhau khi so sánh với con trỏ.

Bạn có thể kiểm tra nó bằng cách,

std::cout << std::boolalpha << ("testString"=="testString"); 

LIVE

Dù sao, bạn không nên phụ thuộc vào nó, hành vi không được bảo đảm.

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