2016-05-18 20 views
6

Tôi đã thấy mọi người đề xuất để tránh việc in các biến số càng nhiều càng tốt trong các ứng dụng có hiệu suất cao. Tôi không bao giờ hiểu lý do cho điều này và tôi có xu hướng typecast rất nhiều lần chủ yếu là để tránh cảnh báo trình biên dịch. Điều này có bất kỳ tác động nào đến hiệu suất không ?. đang Thường gặp:chi phí hoạt động của các biến typecasting trong C

1) struct X * chuyền qua một chức năng mà phải mất void *

2) uint16_t typecasted để uint32_t

+0

Việc truyền hầu hết được thực hiện trong suốt thời gian biên dịch (không chắc chắn về điểm cố định với dấu phẩy động và ngược lại, nhưng chắc chắn nhất đối với loại con trỏ), vì vậy không có tác động thời gian chạy. –

+0

Cảm giác chung cho thấy rằng chuyển đổi đến/từ điểm nổi phải mất một số chu kỳ CPU ... –

+0

@iharob: Bạn đã xóa câu trả lời của mình, vì vậy tôi sẽ tham khảo nhận xét cuối cùng của bạn tại đây. Các loại dấu phẩy động thường được biểu diễn bằng định dạng IEEE-754 (không chắc chắn liệu tiêu chuẩn ngôn ngữ C có quy định điều đó hay không). Ví dụ: 4.0 và 4 có khả năng được biểu diễn bằng "các bit hoàn toàn khác nhau". Vì vậy, đúc giữa chúng bắt buộc một số loại hoạt động sẽ được thực hiện trong thời gian chạy. –

Trả lời

9

Liệu [đúc] có bất kỳ ảnh hưởng đến hiệu suất?

Không trực tiếp. Dàn diễn viên loại biểu thị một chuyển đổi rõ ràng của một giá trị từ một loại dữ liệu này sang loại dữ liệu khác. Nó thực sự là chuyển đổi có tiềm năng cho một tác động hiệu suất, và nếu một chuyển đổi như vậy sẽ được thực hiện cho dù bạn bỏ hay không, thì diễn viên không có tác động hiệu suất bất cứ điều gì. Ví dụ, một số trình biên dịch có thể được đặt để cảnh báo về chuyển đổi ngầm từ các loại dấu phẩy động thành các loại số nguyên và thường những cảnh báo này có thể bị tắt tiếng bằng cách thực hiện chuyển đổi rõ ràng với dàn diễn viên. Điều đó không làm thay đổi thực tế là một chuyển đổi sẽ được thực hiện và các chuyển đổi đó không phải là miễn phí, nhưng diễn viên không làm cho chuyển đổi trở nên đắt hơn bất kỳ cách nào khác.

Ngoài ra, một số chuyển đổi có thể được triển khai miễn phí. Ví dụ, trên hầu hết các máy, các kiểu số nguyên đã ký và không dấu có cùng chiều rộng có các biểu diễn tương thích, do đó, chuyển đổi các giá trị giữa các kiểu này là một no-op. Các hành vi chỉ thêm hoặc loại bỏ các loại vòng loại khác với số _Atomic cũng nằm trong danh mục này.

đối với ví dụ cụ thể của bạn Với:

1) struct X * chuyền qua một chức năng mà phải mất void *

C không yêu cầu cơ quan đại diện tương thích với nhiều loại con trỏ khác nhau, nhưng trong thực tế nó là hiếm những ngày này cho các kiểu con trỏ đối tượng khác nhau để có các biểu diễn khác nhau. Do đó, chuyển đổi giữa các loại con trỏ thường miễn phí. Điều đó hầu như không quan trọng, tuy nhiên, vì trường hợp cụ thể mà bạn hỏi là một trong đó chuyển đổi sẽ được thực hiện cho dù bạn chèn một diễn viên rõ ràng hay không.

2) uint16_t typecasted để uint32_t

Điều này có thể được tự do, tùy thuộc vào hoàn cảnh cụ thể và thực hiện biên dịch. Ví dụ, nếu giá trị đang được chuyển đổi đã được giữ trong một thanh ghi 32 bit, thì nó là một no-op. Ngoài ra, trình biên dịch có thể thực hiện nó như là một no-op trong biểu thức cụ thể mà nó xuất hiện. Cũng lưu ý rằng nếu uint32_t giống như unsigned int, như thông dụng, thì ngữ nghĩa C yêu cầu chuyển đổi cụ thể này phải được thực hiện thường xuyên trong việc đánh giá biểu thức số học, vì vậy nhiều biến thể này rơi vào danh mục chuyển đổi sẽ xảy ra cho dù bạn đúc hay không.

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