2010-10-05 24 views
6

Tôi hiểu hành vi của const loại dữ liệu đủ điều kiện. Mặc dù vậy, tôi tò mò, nếu có bất kỳ sự tăng hoặc giảm hiệu suất nào từ sự quá mức hoặc quá nhiệt tình của các biến số đủ điều kiện là const. Tôi đang suy nghĩ đặc biệt của các biến khai báo và sử dụng độc quyền trong một khối mã bị cô lập. Ví dụ, một cái gì đó như:Việc khai báo các biến C++ có giúp ích hoặc làm tổn thương hiệu suất không?

const qreal padding = CalculatePadding(); 
const QSizeF page_size = CalculatePagePreviewSize(padding); 
const QRectF content_rect = CalculatePagePreviewContentRect(page_size); 
const QList<QRectF> pages = renderer.BuildPrintPages(printer_, map_scene_); 
const QFont page_number_font = CalculatePageNumberFont(); 
const QFontMetrics metrics(page_number_font); 

Giả sử tôi chỉ cần const phương pháp -qualified trên tất cả các Có đạt được hiệu suất thực hiện kê khai tất cả chúng const (và nhiều hơn nữa.)? Hoặc, ngược lại, điều này có thực sự làm tổn thương hiệu suất không?

Tôi tò mò về cả hiệu suất thời gian chạy (Tôi đoán điều này không có sự khác biệt vì const là độc quyền kiểm tra thời gian biên dịch - có thể ai đó xác nhận?) và hiệu suất biên dịch. Tôi không có đủ kinh nghiệm với C++ để có một cảm giác cho điều này, và tôi tự hỏi nếu tôi nên sai về phía trên hoặc dưới áp dụng const khi tất cả những thứ khác (bảo trì, vv) là bình đẳng.

+1

trong hầu hết các trường hợp, không có chênh lệch hiệu suất thời gian chạy – Anycorn

+2

dupe? http://stackoverflow.com/questions/3435026/can-const-correctness-improve-performance – Anycorn

+0

Qt là nhiều bản sao trên ghi vì vậy tôi nghi ngờ const có thể có một hiệu ứng thực sự ở đây. –

Trả lời

20

const chủ yếu là thời gian biên dịch, tuy nhiên, việc khai báo điều gì đó là const đôi khi cho phép tối ưu hóa nhất định. Nếu các mã trong câu hỏi không phải là một nút cổ chai hiệu suất, tôi sẽ không lo lắng về nó và chỉ sử dụng const như dự định: để sản xuất mã rõ ràng hơn và ngăn cản mình làm những điều ngu ngốc.

2

Hiểu biết của tôi là const có thể được trình biên dịch sử dụng để có khả năng tối ưu hóa hiệu suất, nhưng không đảm bảo như vậy; không nên có một nhược điểm hiệu suất, mặc dù. Nó có khả năng ảnh hưởng đến hành vi thời gian chạy (ví dụ: trình biên dịch có thể đặt các biến const trên các trang bộ nhớ chỉ đọc).

Nó sẽ không có tác động đáng kể đến hiệu suất, nhưng tôi sẽ gặp lỗi khi sử dụng nó nhiều hơn để dễ bảo trì mã. Chỉ cần ý kiến ​​của tôi, mặc dù.

1

Trong khi câu trả lời là "có" về mặt kỹ thuật, câu trả lời thực tế là KHÔNG. Đúng là trình biên dịch có thể, trong một số trường hợp nhất định, thực hiện tối ưu hóa mã bằng cách tính đến một giá trị đã cho không thể thay đổi hoặc một phương thức sẽ không sửa đổi đối tượng sở hữu. Tuy nhiên, đây sẽ là trường hợp tình huống và do đó cực kỳ xa xuống trong cỏ dại của tối ưu hóa rằng nó gần như chắc chắn sẽ là một sai lầm để đưa nó vào tài khoản lên phía trước.

0

const chỉ có sẵn để giúp bạn phát hiện lỗi tại thời gian biên dịch. Tuy nhiên vì có điều này được gọi là const_cast bạn luôn có thể thay đổi constness của bất kỳ biến để trình biên dịch thực sự không thể lấy đi với tối ưu hóa bất cứ điều gì đi. (Bạn cũng có thể vui chơi với các c-style phôi để loại bỏ constness mà có thể làm cho tối ưu hóa không hợp lệ.)

+1

tránh 'const_cast' mọi lúc và chỉ sử dụng khi bạn không có lựa chọn (ví dụ: bạn đang làm việc với một lib bên ngoài, bạn không thể thay đổi giao diện, nhưng biết sửa đổi đối tượng const là" đủ an toàn ") . – rubenvb

+2

Điều này không thực sự đúng. Nếu bạn đã định nghĩa một biến là const, bạn không thể bỏ biến đó đi * và * ghi vào nó. Một trình biên dịch lưu trữ một giá trị biến dựa trên thực tế là biến là const là alright. Bất kỳ chương trình nào ghi vào biến const đều có hành vi không xác định. –

+0

Johannes - kết quả đầu tiên từ tìm kiếm trên google về const và tối ưu hóa: http://www.gotw.ca/gotw/081.htm - tự mình thử, bạn có thể viết cho biến không được sửa đổi – miked

2

Trong kinh nghiệm của tôi (giới hạn), const CÓ THỂ làm tổn thương hiệu suất của rất nhiều (ngạc nhiên!) Cụ thể, khi làm việc với các lớp container phải cẩn thận những gì liên quan đến: đối với các mảng, nó có thể đơn giản buộc trình biên dịch tạo một bản sao của thùng chứa của bạn (ví dụ, một mảng) khi một phần tử duy nhất được truy cập chỉ đọc ... đau để xác định vị trí trong mã mà tôi đang làm việc.

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