2012-10-14 29 views
6

Nếu tôi có một boolean và một số mã có thể thay đổi nó, và sau đó tôi muốn đặt nó là true, tôi có nên kiểm tra xem đó là false không?Bạn có nên kiểm tra biến trước khi đặt giá trị của nó trong C++ không?

Ví dụ:

bool b = false; 
// Some code 
// Here "b" can be true or false 
if (cond) { 
    b = true; 
} 

vs

bool b = false; 
// Some code 
// Here `b` can be `true` or `false` 
if (cond && !b){ 
    b = true; 
} 

Đó là nhanh hơn?

Note:

tôi hỏi rằng vì việc thực hiện sau đây Sieve of Eratosthenes:. http://bloc.gerardfarras.com/wp-content/uploads/2011/12/erastotenes.txt

if ((i % divisor == 0) && (numsprimers[i] == 0)) { 
    numsprimers[i] = 1; 
} 

(Nếu numsprimers[i]==1 nó có nghĩa là i không phải là một số nguyên tố Và nếu nó 0 nó có thể là số nguyên tố hay không)

+1

Một cách khác để nghĩ về điều này là: "Tại sao chọn? Chỉ cần ghi đè lên!" – Mysticial

+0

@ Thực tế tôi nhớ một chương trình đạt được tốc độ tăng rất lớn bằng cách kiểm tra giá trị boolean và sau đó ghi đè lên nó thay vì chỉ ghi đè lên nó. Tôi không có điểm chuẩn nhưng có lẽ sẽ có giá trị ... –

+0

@SethCarnegie Đó có phải là loại do người dùng xác định không? – Mysticial

Trả lời

2

Nó đang rất rất nitpicky, nhưng nói chung tốt hơn là chỉ thay đổi giá trị.

Kiểm tra và đặt giá trị có cùng chi phí như nhau, vậy tại sao bạn muốn phải thực hiện cả hai trong một số trường hợp?

Bây giờ, nếu bạn tự hỏi liệu bạn có nên ghi đè lên một số loại tùy chỉnh hay không (nếu bạn nói danh sách 100000 từ) hoặc nếu bạn nên kiểm tra xem liệu nó có cần được ghi đè trước không (ví dụ, chỉ cần kiểm tra giá trị boolean hoặc dấu thời gian) thì bạn nên kiểm tra trước, bởi vì chi phí kiểm tra boolean hoặc dấu thời gian ít hơn nhiều so với việc ghi nhiều từ vào bộ nhớ. Đây là tất nhiên tất cả phụ thuộc vào nhiều thứ khác nhau như bộ nhớ bạn đang chỉnh sửa có trong bộ nhớ cache hay không, mức độ "kiểm tra" tốn bao nhiêu, bạn cần phải ghi đè giá trị bao lâu một lần so với tần suất không cần thiết để được ghi đè, và tất nhiên là kích thước của bộ nhớ.

+1

Với Sieve của bạn, vì giá trị duy nhất có thể là 0 và 1, tôi không thấy lý do nào để kiểm tra giá trị của numsprimers [i] trước khi thay đổi nó. Điều này dẫn đến một số hướng dẫn sau khi tất cả: Nhận giá trị của nuprimers [i]. So sánh nó với 0. Nhảy đến một nơi khác trong mã nếu nó là 0. – Ben

+0

từ lâu, có lẽ tôi vẫn nhận được câu trả lời: Trong trường hợp của tôi, hầu hết các phần tử vẫn sẽ có giá trị mong muốn = true. Vì vậy, kiểm tra xem giá trị có đúng hay không có thể tránh đặt lại giá trị đó thành true. Liệu "chỉ thay đổi giá trị mà không kiểm tra nó trước" vẫn là một hoạt động nhanh như nhau nếu chúng ta nói về hàng chục triệu nguyên tố trong tổng? – Kaspatoo

+0

Tôi thấy nó kỳ lạ mà không ai ở đây giải quyết đa luồng. Theo như tôi biết (bất kể khóa) bằng văn bản làm cho một dòng bộ nhớ cache "bẩn" và buộc tất cả các lõi khác để tải lại nó, trong khi đọc không. Một câu hỏi rõ ràng có ý nghĩa là liệu việc viết cùng một giá trị vào bộ nhớ đệm đánh dấu nó là bẩn và buộc tải lại các bộ đệm lõi khác, trong một số trường hợp, chắc chắn sẽ làm cho tùy chọn "chỉ ghi đè" chậm hơn kiểm tra và ghi đè (như kiểm tra sẽ để lại bộ nhớ cache của lõi khác còn nguyên vẹn). – Cookie

0

Làm thế nào về:

if (b = !!cond) { 

} 

Nơi bạn kiểm tra điều kiện và áp dụng các giá trị cho b, nếu nó là cần thiết cho b để có một giá trị. Nếu bạn muốn b để giữ sự thật thì tôi nói để sử dụng một trong các ví dụ khác của bạn. Nó không nên tạo sự khác biệt.

+0

Nhưng có thể 'cond' là' false' và 'b' là' true'. Tôi muốn 'b' giữ nguyên' true'. – Oriol

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