Tôi đang phát triển cho nền tảng AVR và tôi có một câu hỏi. Tôi không muốn thư viện dấu chấm động được liên kết với mã của tôi, nhưng tôi thích khái niệm có giá trị tương tự của phạm vi 0.0 ... 1.0 thay vì 0 ... 255 và 0 ... 1023, tùy thuộc vào thậm chí cho dù tôi đang sử dụng cổng làm đầu vào hay đầu ra.Tối ưu hóa điểm nổi biên dịch GCC
Vì vậy, tôi đã quyết định nhân các đối số của các chức năng đầu vào/đầu ra theo 1023.0 và 255.0, liên tục. Bây giờ, câu hỏi của tôi là: nếu tôi thực hiện việc phân chia như thế này:
#define analog_out(port, bit) _analog_out(port, ((uint8_t)((bit) * 255.0)))
sẽ GCC (với cờ O3 bật) tối ưu hóa thời gian biên dịch multiplications điểm, được biết đến tại thời gian biên dịch và đúc một thể thiếu nổi loại, thành các hoạt động số nguyên? (Tôi biết rằng khi sử dụng các macro này với các đối số không liên tục, việc tối ưu hóa là không thể, tôi chỉ muốn biết nếu nó sẽ được thực hiện trong trường hợp khác.)
Đây không phải là phép nhân, không chia? ('analog_out (7, 0.5)' trở thành một ghi '0,5 * 255' thành cổng 7, chứ không phải là ghi 0 cắt nhỏ từ 1/510) ... – Borealid
vâng, chắc chắn :) Đã sửa. –
Hãy thử và tìm hiểu! 'gcc -S' sẽ tạo ra một vùng kết xuất. Bạn có thể muốn '-O2 -ffast-math' cho điều này, không phải' -O3' ('-O3' bật tối ưu hóa mà hầu như luôn luôn là một mạng * mất *, giống như nội tuyến quá tích cực, nó có nghĩa là để được sử dụng trên một tệp mà chương trình của bạn dành 90% thời gian của nó). – zwol