2013-07-07 27 views
6

Được cung cấp mã sau:Trình tối ưu hóa có chuyển các loại không thuộc POD tạm thời ra khỏi vòng lặp không?

while(is_running) 
{ 
    std::vector<buffer> buffers; 

    // fill buffers 

    // use buffers 
} 

Trình biên dịch hiện đại có thực hiện chuyển đổi sau không?

std::vector<bufer> buffers; 

while(is_running) 
{ 
    // fill buffers 

    // use buffers 

    buffers.clear(); 
} 
+0

Tại sao bạn nghĩ câu lệnh thứ hai hiệu quả hơn? Bạn có hồ sơ? –

+1

@LuchianGrigore Lý do duy nhất tôi có thể nghĩ là phiên bản đầu tiên phải có một phân bổ/de-phân bổ cho mỗi chu kỳ vòng lặp, thứ hai không nhất thiết phải như vậy. – juanchopanza

+0

@juanchopanza: Đúng, điều thứ hai sẽ không phân bổ/deallocate không nhất thiết trong mỗi lần lặp vòng lặp. – ronag

Trả lời

4

Cách duy nhất để biết một cách chắc chắn sẽ là để kiểm tra, nhưng tôi sẽ thay ngạc nhiên khi thấy một ưu thực hiện tối ưu hóa này.

Để bắt đầu thực hiện tối ưu hóa này, trình biên dịch sẽ phải 1) biết đủ về nội bộ của các hàm liên quan đến "nhận ra" (ví dụ) operator newoperator delete về cơ bản là hình ảnh phản chiếu của nhau hoặc 2) nó sẽ phải tạo tất cả mã cho tất cả các chức năng nội tuyến (tất cả các con đường xuống các lời gọi của operator newoperator delete, và có đủ thông minh để có thể suy ra kết luận tương tự từ mã.

Tôi hầu như không thể tưởng tượng được cái đầu tiên, nhưng đừng nhớ là đã từng nhìn thấy nó, với sự phức tạp của một người quản lý heap điển hình, e thực sự không thể tin được.

Tóm lại: Tôi đã rất ngạc nhiên trước đây, và tôi chắc chắn tôi sẽ trở lại - nhưng sẽ là một bất ngờ lớn hơn hầu hết.

+2

Ngoài ra, trình biên dịch sẽ phải lo lắng về các tác dụng phụ của, ví dụ, các biến toàn cầu - bao gồm ví dụ 'errno'. –

0

Tôi sẽ ngạc nhiên khi thấy rằng trình biên dịch thực sự biết các vùng chứa std và gọi các phương thức của chúng mà không có yêu cầu rõ ràng của tôi. Nếu đó là trường hợp, hãy tưởng tượng logic của trình biên dịch sẽ cần phải được tăng cường bất cứ khi nào một mô-đun thư viện mới được phát hành!

Thật thú vị, tuy nhiên, để tìm ra rằng một số trình biên dịch C++ có một số kiến ​​thức về Thư viện chuẩn.

EDIT: Ok, tôi đã tìm thấy một ví dụ về kiến ​​thức đó: C++ 11 dựa trên phạm vi cho các vòng áp dụng std :: begin và std :: end to range.

Dù sao, chúng tôi là những người lập trình, những người phải thực sự hiểu mã chúng tôi viết là gì và tìm ra cách để tối ưu hóa nó. Trình biên dịch chỉ cần dịch các hướng dẫn của chúng tôi chỉ áp dụng các tối ưu hóa nhỏ (nhưng quan trọng) (như nội tuyến, sao chép elision, v.v.)

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