2013-04-27 35 views
5
string str="fujian"; 

Một số sách nói rằng mã sẽ kích hoạt trình tạo bản sao, nhưng g ++ sẽ tối ưu hóa nó sao cho trình tạo bản sao sẽ không được gọi.Tại sao không thể -O0 vô hiệu hóa tối ưu hóa biên dịch gcc?

Tuy nhiên, tôi đã sử dụng lệnh g ++ -O0 để vô hiệu hóa tối ưu hóa, nhưng vẫn không thể kích hoạt trình tạo bản sao.

Làm thế nào để hiểu nó?

+0

Làm thế nào để bạn xác định liệu các nhà xây dựng sao chép được gọi là? –

+0

Tôi viết lại hàm tạo bản sao và nhật ký được gọi là – jiafu

+0

Đoán của tôi là ở một số vị trí g ++ đang thực hiện việc gấp/truyền liên tục - có thể nằm trong giao diện người dùng. Và tôi đoán bạn không thể vô hiệu hóa điều đó. – JohnTortugo

Trả lời

9

Với GCC và Clang, bạn có thể sử dụng cờ biên soạn -fno-elide-constructors để tắt sao chép/di chuyển tối ưu hóa elision.

+0

tại sao o0 không thể hoạt động? – jiafu

+0

Tôi không muốn làm cho tất cả để sao chép tigger, nhưng để hiểu các nguyên tắc cơ bản để nghiên cứu – jiafu

+0

@jiafu: Tôi không chắc chắn tại sao '-o0' sẽ không giúp ức chế sao chép/di chuyển elision. Nếu bạn muốn ngăn chặn hành vi đó, bạn cần sử dụng lá cờ đó. –

1

Quy tắc sao chép bản sao dựa trên ISO C++ 12.8. Mặc dù các quy tắc khác được sử dụng chung để tối ưu hóa được gọi chung là quy tắc "as-if" ở khoản 1 (cho phép triển khai tạo chương trình hoạt động hơi khác với ngữ nghĩa chương trình "không được tối ưu hóa" dựa trên mô hình máy trừu tượng), quy tắc này đặc biệt là bạn có thể xử lý chính mã "được tối ưu hóa" hoạt động chính xác như ý nghĩa ban đầu. Nói cách khác, các lời gọi hàm dựng ưu tú có thể không tồn tại chút nào trong hành vi của máy trừu tượng.

Nếu không có hành vi không xác định, có hoặc không có tối ưu hóa theo như-nếu quy tắc, thể quan sát được hành vi của chương trình tối ưu hóa và không được tối ưu hóa chương trình nên cùng (mặc dù họ có thể khác nhau về hiệu suất, vv) . Tuy nhiên, sao chép elision là tích cực hơn, cụ thể là, nó có thể thay đổi hành vi quan sát được.

Bạn nên không dựa vào sự khác biệt được tạo ra bởi bản sao chép. Vì vậy, nó là hợp lý để giữ cho hành vi tương tự cho các tùy chọn tối ưu hóa thông thường và cung cấp một tùy chọn riêng biệt để kiểm soát hành vi chính xác (khác) cho người dùng biết những rủi ro tốt và thực sự cần nó.

WG21/N4296

1,9 thực hiện Chương trình

5 A phù hợp thực hiện thực hiện một chương trình cũng như hình thành phải xuất trình cùng một hành vi quan sát là một trong những hành có thể xảy ra trường hợp tương ứng của máy trừu tượng với cùng một chương trình và cùng một đầu vào. Tuy nhiên, nếu bất kỳ việc thực thi nào như vậy có chứa một hoạt động không xác định, thì các địa chỉ tiêu chuẩn quốc tế không yêu cầu thực hiện chương trình với đầu vào đó (thậm chí không liên quan đến các hoạt động trước hoạt động không xác định đầu tiên).

8 Các yêu cầu tối thiểu về việc thực hiện phù hợp là:

(8,1) - Tiếp cận đối tượng dễ bay hơi được đánh giá theo đúng các quy tắc của máy trừu tượng.

(8.2) - Khi chấm dứt chương trình, tất cả dữ liệu được ghi vào tệp phải giống hệt với một trong các kết quả có thể thực hiện của chương trình theo ngữ nghĩa trừu tượng.

(8.3) - Động lực đầu vào và đầu ra của các thiết bị tương tác sẽ diễn ra theo cách như vậy khiến cho đầu ra thực sự được phân phối trước khi chương trình chờ đầu vào. Điều gì cấu thành một thiết bị tương tác được thực hiện xác định.

Chúng được gọi chung là hành vi quan sát được của chương trình. [Lưu ý: Các tương ứng nghiêm ngặt hơn giữa ngữ nghĩa trừu tượng và thực tế có thể được xác định bởi mỗi lần triển khai. -end note]

12,8 Sao chép và di chuyển các đối tượng lớp

31 Khi tiêu chí nhất định được đáp ứng, một thực hiện được phép bỏ qua việc xây dựng sao chép/di chuyển của một đối tượng lớp , ngay cả khi các nhà xây dựng được lựa chọn cho hoạt động sao chép/di chuyển và/hoặc destructor cho đối tượng có các tác dụng phụ. Trong trường hợp này, việc triển khai xử lý nguồn và đích của thao tác sao chép/di chuyển bị bỏ qua chỉ đơn giản là hai cách khác nhau đề cập đến cùng một đối tượng và việc hủy bỏ đối tượng đó xảy ra vào cuối thời gian khi hai đối tượng đã bị phá hủy mà không có sự optimization.122 sự bỏ bớt này hoạt động sao chép/di chuyển, được gọi là bản sao sự bỏ bớt, được cho phép trong các trường hợp sau (mà có thể được kết hợp để loại bỏ nhiều bản sao):

...

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