Tôi đã tìm kiếm xung quanh một chút và tôi chưa thực sự đưa ra câu trả lời cho điều này.Một số nguyên tắc tốt để chọn kích thước của các loại số nguyên là gì?
Khi tôi lập trình trên các thiết bị nhúng có bộ nhớ hạn chế, tôi thường có thói quen sử dụng loại điểm nổi/nhỏ nhất sẽ thực hiện công việc, ví dụ, nếu tôi biết rằng bộ đếm sẽ luôn là giữa số không và 255, tôi sẽ khai báo nó là uint8_t
.
Tuy nhiên, trong môi trường ít bộ nhớ bị hạn chế, tôi thường chỉ sử dụng int
cho mọi thứ, theo số Google C++ Styleguide. Khi tôi nhìn vào mã hiện có, nó thường có xu hướng được thực hiện theo cách này.
Để rõ ràng, tôi nhận được lý do đằng sau việc này, (Google giải thích rất rõ), nhưng tôi không rõ ràng về lý do đằng sau việc đầu tiên. Có vẻ như với tôi rằng việc giảm dung lượng bộ nhớ của chương trình của bạn, ngay cả trên một hệ thống mà bạn không quan tâm đến việc sử dụng bộ nhớ, sẽ tốt cho tốc độ tổng thể, vì dữ liệu tổng thể ít có ý nghĩa hơn có thể phù hợp với bộ nhớ cache CPU.
Vấn đề phức tạp, tuy nhiên, thực tế là các trình biên dịch sẽ tự động đệm dữ liệu và căn chỉnh nó với các ranh giới sao cho nó có thể được tìm nạp trong một chu kỳ xe buýt duy nhất. Tôi đoán, sau đó, nó đi xuống để có hay không trình biên dịch là đủ thông minh để có, nói, hai 32-bit số nguyên và dính chúng lại với nhau trong một khối 64-bit so với cá nhân đệm mỗi một đến 64 bit.
Tôi cho rằng bản thân CPU có thể tận dụng lợi thế của điều này hay không phụ thuộc vào nội bộ chính xác của nó, nhưng ý tưởng tối ưu hóa kích thước bộ nhớ sẽ cải thiện hiệu suất, đặc biệt là trên các bộ vi xử lý mới hơn, được chứng minh trong thực tế là hạt nhân Linux relied for awhile tùy chọn -0s
của gcc để tăng hiệu suất tổng thể.
Vì vậy, tôi đoán câu hỏi của tôi là lý do khiến phương pháp của Google dường như phổ biến hơn nhiều trong mã thực. Có một chi phí ẩn ở đây mà tôi đang thiếu?
Nguyên tắc về phong cách của Google không xem xét lập trình nhúng và bộ nhớ bị hạn chế. Hoặc, bộ nhớ bị hạn chế đối với các nguyên tắc của Google chỉ có bộ nhớ gigabyte hoặc hai bộ nhớ. Nếu bạn đang lập trình cho 64 KiB hoặc 1 MiB bộ nhớ, bạn đang làm việc trong một môi trường rất khác với giả định của Google. –
Bạn cũng cần phải xem xét rằng bộ nhớ trên ngăn xếp là nhiều hơn hoặc ít hơn miễn phí với số lượng nhỏ, và tiết kiệm bộ nhớ bằng cách sử dụng một loại hẹp * có thể * yêu cầu trình biên dịch để phát ra các hướng dẫn thêm. Đây là suy nghĩ đằng sau việc sử dụng 'int' trừ khi bạn có lý do để không: chẳng hạn như khi nó là một phần tử mảng, hoặc một cấu trúc hoặc thành viên lớp. – EJP
Đôi khi một kiểu dữ liệu lớn hơn có hiệu suất cao hơn. Ví dụ, 'double' có thể cho hiệu suất tốt hơn bởi vì CPU hiện đại thường được xây dựng để làm việc trên' double' thay vì 'float' (nhưng nếu bạn có một tấn, thì có lẽ 'float' sẽ tốt hơn vì bạn có thể cache nhiều hơn ...). Ngoài ra, '-Os' tối ưu hóa số lượng lệnh ít hơn, không phải kích thước của các kiểu dữ liệu đang được vận hành; cờ đó là trực giao với câu hỏi của bạn. – Cornstalks