2013-02-28 28 views
9

Vì vậy, tôi thường thấy một cái gì đó như thế này:Bao gồm phép tính số học khi xác định một hằng số

#define gf_PI f32(3.14159265358979323846264338327950288419716939937510) 
#define gf_PIhalf f32(3.14159265358979323846264338327950288419716939937510 * 0.5) 

Điều này có nghĩa rằng giá trị PI nửa được tính mỗi khi tôi sử dụng gf_PIhalf trong mã của tôi, phải không?
Chẳng phải tốt hơn là viết giá trị của một nửa PI chứ?

Nó sẽ không thể tốt hơn để làm như sau:

#define gf_PI f32(3.14159265358979323846264338327950288419716939937510) 
const float gf_PIHalf = gf_PI * 0.5f; // PIHalf is calculated once 

Cuối cùng nó sẽ không là tốt nhất để làm điều đó như thế này (và tại sao nó dường như không phải là một thực tế phổ biến):

const float gf_PI = 3.14159265358979323846264338327950288419716939937510; 
const float gf_PIHalf = gf_PI * 0.5f; 
+1

bạn có thực sự quan tâm nếu chương trình của bạn thực hiện một phép nhân nhiều hơn? là nó thực sự quan trọng? – Smash

+0

Đây là một câu hỏi hay. Tôi đã từng hỏi một câu hỏi tương tự về ràng buộc và hiệu quả của bộ nhớ, và tôi nghĩ câu trả lời tiêu chuẩn tôi nhận được tương tự như "Thành thật mà nói, với tốc độ này, nó không quan trọng. Đó là một lượng nhỏ dữ liệu mà tỷ lệ hiệu quả không ' mất nhiều hit. " Tôi nghĩ trong trường hợp này, bạn sẽ thấy rằng hiệu quả của chương trình không nhất thiết phải chịu VS. ý tưởng rằng bạn nhận được phép tính lại mà bạn có thể tin tưởng mọi lúc. Nếu bạn tự tin về số học, tôi sẽ cho hiệu quả thuần túy. – plast1K

+0

Hãy xem, một trình biên dịch tốt sẽ tối ưu hóa [ngay cả một mớ hỗn độn hoàn chỉnh như thế này] (http://stackoverflow.com/questions/15114140/writing-binary-number-system-in-c-code/15114188#15114188) vào một hằng số ... –

Trả lời

11

Điều này có nghĩa rằng giá trị PI nửa được tính mỗi khi tôi sử dụng gf_PIhalf trong mã của tôi, phải không?

Không, không có khả năng.

Bạn có thể đếm một cách hợp lý trên trình biên dịch của mình để thực hiện phép nhân đó tại thời gian biên dịch chứ không phải thời gian chạy.

3

Kết luận của bạn có phần đúng, ngoại trừ phiên bản #define gần như chắc chắn sẽ giải quyết trong thời gian biên dịch và bit về các loại const globals không phổ biến. Họ là thực tế phổ biến trong mã tốt hiện đại. #define s là tất cả nhưng đã chết cho việc sử dụng này. Việc thực hành tốt nhất là xác định phạm vi globals tập tin của bạn trong một không gian tên vô danh:

namespace 
{ 
    const float g_SomeGlobal = 123.456f; 
} 

Điều này ngăn cản bất kỳ ai ngoài đơn vị dịch của bạn khỏi việc có thể 'nhìn thấy' g_SomeGlobal.

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