2012-02-08 45 views
5

thể trùng lặp:
C/C++: Optimization of pointers to string constantsTham chiếu chuỗi có trùng lặp không?

Giả sử bạn có một chuỗi "example" quy định tại rất nhiều nơi

// module1.h 
char *x = "example"; 
// module2.h 
char *a[] = { "text", "example" }; 
// module3.c 
printf("example"); 
//etc. 

sẽ dữ liệu này sẽ được nhân đôi hoặc sẽ làm cho trình biên dịch chỉ có một tham chiếu đến nó?

+0

Phụ thuộc vào trình biên dịch/liên kết và các tùy chọn. Tôi tin rằng tối ưu hóa toàn bộ chương trình và một trình liên kết thông minh sẽ kết hợp các bản sao nhưng không nhớ tài liệu tham khảo. – JimR

Trả lời

8

Đó là thực hiện phụ thuộc. Nhưng đó là tinh thần của bất động sản bất biến của chuỗi ký tự.

Trích dẫn từ C99 Lý do trên xâu:

"literals String được không nhất thiết phải sửa đổi đặc điểm kỹ thuật này cho phép triển khai để chia sẻ các bản sao của chuỗi với văn bản giống hệt nhau, để đặt xâu ở chế độ đọc. chỉ có bộ nhớ và để thực hiện tối ưu hóa nhất định "

0

Đó là chi tiết triển khai và người viết trình biên dịch được tự do làm bất kỳ cách nào họ muốn. Nhiều trình biên dịch có một công tắc để kiểm soát xem các chuỗi ký tự trùng lặp có tham chiếu đến cùng một địa chỉ hay không.

2

Đó là "chi tiết triển khai". Điều này có nghĩa rằng một số trình biên dịch thông minh sẽ thống nhất các chuỗi trong bộ nhớ trong khi những trình biên dịch khác sẽ tạo các bản sao riêng biệt.

Và cuối cùng, một số trình biên dịch sẽ làm một việc với các tùy chọn biên dịch nhất định và những thứ khác với các tùy chọn khác ...

+0

Đây không phải là * thực hiện được xác định * theo nghĩa là việc triển khai không phải ghi lại chi tiết thực hiện này (theo yêu cầu với hành vi được xác định thực hiện) nhưng tất nhiên điều này phụ thuộc vào việc triển khai thực hiện. – ouah

+0

@ouah Nói cách khác, nó được ghi nhận là không có giấy tờ ;-) – Neil

+0

@ouah - Chi tiết tinh tế và làm rõ rõ. Đã chỉnh sửa câu trả lời để tránh nhầm lẫn. – rodrigo

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