2009-03-30 27 views
8

Tôi luôn sử dụng typedef trong lập trình nhúng để tránh những sai lầm phổ biến:typedefs thông minh

int8_t-8 bit đã ký số nguyên
int16_t - 16 bit đã ký số nguyên
int32_t-32 bit đã ký số nguyên
uint8_t - 8 bit số không dấu
uint16_t - Số nguyên không dấu 16 bit
uint32_t - Số nguyên không dấu 32 bit

Phương pháp nhúng gần đây (vấn đề 177, chưa có trên trang web) giới thiệu cho tôi ý tưởng hữu ích khi có một số typedef cụ thể về hiệu suất. This standard đề xuất có typedefs cho biết bạn muốn loại nhanh nhất có kích thước tối thiểu.

Ví dụ, người ta có thể khai báo một biến sử dụng int_fast16_t, nhưng nó thực sự sẽ được thực hiện như một int32_t trên một bộ xử lý 32 bit, hoặc int64_t trên một bộ xử lý 64 bit như những người sẽ là loại nhanh nhất trong ít nhất 16 bit trên những nền tảng đó. Trên bộ xử lý 8 bit, nó sẽ là các bit int16_t để đáp ứng yêu cầu kích thước tối thiểu.

Có bao giờ thấy việc sử dụng này trước khi tôi muốn biết

  • Bạn đã thấy điều này trong bất kỳ dự án, nhúng hoặc?
  • Bất kỳ lý do nào có thể để tránh loại tối ưu hóa này trong typedefs?

Trả lời

4

Ví dụ, người ta có thể khai báo một biến sử dụng int_fast16_t, nhưng nó thực sự sẽ được thực hiện như một int32_t trên một bộ xử lý 32 bit, hoặc int64_t trên một bộ xử lý 64 bit như những sẽ là nhanh nhất các loại ít nhất là 16 bit trên các nền tảng đó

Đó là những gì int cho, phải không? Bạn có khả năng gặp phải một CPU 8 bit bất kỳ lúc nào, nơi mà không đủ?

Có bao nhiêu kiểu dữ liệu duy nhất mà bạn có thể ghi nhớ?

Có cung cấp nhiều lợi ích bổ sung đáng giá gấp đôi số lượng loại cần xem xét bất cứ khi nào tôi tạo biến số nguyên đơn giản không?

Tôi đang gặp khó khăn trong việc tưởng tượng khả năng có thể được sử dụng nhất quán.

Ai đó sẽ viết một hàm trả về một int16fast_t và sau đó một người khác sẽ đến và lưu biến đó vào một số int16_t.

Điều đó có nghĩa là trong trường hợp ít người biết, các biến thể nhanh thực sự có lợi, nó có thể thay đổi hành vi mã của bạn. Nó thậm chí có thể gây ra lỗi trình biên dịch hoặc cảnh báo.

+0

+1 cho sự cố loại trả về chức năng. Trình biên dịch sẽ phàn nàn về các loại khác nhau nếu chúng có kích thước nội bộ khác nhau một khi đã được giải quyết, nhưng nó vẫn thích hợp. Tôi sử dụng 8 bit CPU tất cả thời gian trong công việc nhúng mặc dù, và các vấn đề typedef là cơn ác mộng (các nhà phát triển ứng dụng giả sử int là 32 bit) –

+0

Vâng, chắc chắn sử dụng một cái gì đó như int32_t nếu bạn cần một datatype đó là 32 bit rộng. Giả định về loại int chung là xấu xấu xấu. :) Tôi chỉ nói rằng việc chia các typedefs thành int32 và int32fast có vẻ như nó sẽ thêm ít hơn sự nhầm lẫn bổ sung. – jalf

0

Tôi thực sự không có nhiều người hâm mộ loại điều này.

Tôi đã thấy điều này được thực hiện nhiều lần (trên thực tế, chúng tôi thậm chí có những kiểu chữ này ở nơi làm việc hiện tại của tôi) ... Đối với hầu hết các phần, tôi nghi ngờ tính hữu dụng thực sự của họ ... Nó làm tôi thay đổi thay đổi vì ... (và có, tôi biết kích thước của một số nội dung được cài sẵn có thể khác nhau) ...

3

Lý do chính tôi sẽ tránh typedef này là nó cho phép loại nằm cho người dùng. Hãy int16_t vs int_fast16_t. Cả hai loại tên mã hóa kích thước của giá trị vào tên. Đây không phải là một thực tế không phổ biến trong C/C++. Cá nhân tôi sử dụng kích thước cụ thể typedefs để tránh nhầm lẫn cho bản thân mình và những người khác đọc mã của tôi. Phần lớn mã của chúng tôi phải chạy trên cả nền tảng 32 bit và 64 bit và nhiều người không biết các quy tắc định kích thước khác nhau giữa các nền tảng. Các loại như int32_t loại bỏ sự mơ hồ.

Nếu tôi không đọc đoạn thứ 4 của câu hỏi của bạn và thay vào đó chỉ nhìn thấy tên loại, tôi đã giả định đó là một số cách cụ thể về kịch bản có giá trị 16 bit nhanh. Và tôi rõ ràng sẽ sai: (Đối với tôi, nó sẽ vi phạm quy tắc lập trình "không ngạc nhiên" của lập trình.

Có lẽ nếu nó có một động từ phân biệt, chữ cái, từ viết tắt có tên ít có khả năng hơn Có thể int_fast16min_t?

+0

tiêu chuẩn chỉ định các giá trị đó ... hầu hết các lập trình viên sẽ biết ý nghĩa của chúng. – rmeador

+0

@rmeador, tôi không đồng ý. Chỉ những lập trình viên quen thuộc với tiêu chuẩn đó mới biết và số lượng lập trình viên gần như chắc chắn ít hơn một nửa. Mặt khác, kiến ​​thức về tiêu chuẩn là không cần thiết để hiểu int32_t và tương tự. – JaredPar

+2

Các giá trị có kích thước cụ thể có khả năng không hiệu quả. Có một nhu cầu cho một cái gì đó như "datatype tích phân nhanh nhất của ít nhất 16 bit", đó là định nghĩa cũ cho "int". –

0

Tôi thường sử dụng size_t, nó sẽ là kích thước địa chỉ nhanh nhất, một truyền thống mà tôi đã chọn trong quá trình nhúng. Và nó không bao giờ gây ra bất kỳ vấn đề hay nhầm lẫn nào trong các vòng kết nối nhúng, nhưng nó thực sự bắt đầu gây ra cho tôi các vấn đề khi tôi bắt đầu làm việc trên các hệ thống 64bit.

+0

oof! Đó là những nguy cơ nguy hiểm ... Hơn nữa, nó luôn luôn là nhanh nhất? Trên kiến ​​trúc phân đoạn, size_t có thể lớn hơn bus dữ liệu, yêu cầu hai lần đọc cho mỗi lần sử dụng tối thiểu ... –

+0

Có vấn đề gì? Thực tế là nó lớn hơn int (thường là 32-bit)?Tôi đã chuyển đổi rất nhiều int thành size_ts trong chuyển đổi thành 64 bit và không gặp vấn đề gì với chúng. –

+0

Chủ yếu gây ra các vấn đề với mã serialization, không có gì một vài ngày sửa chữa và thử nghiệm không thể giải quyết, nhưng nó đã được một số công việc phụ, và yêu cầu theo dõi xuống nhiều biến. –

2

Khi tôi đang xem int_fast16_t và tôi không chắc về chiều rộng gốc của CPU mà nó sẽ chạy, nó có thể làm mọi thứ phức tạp, ví dụ như toán tử ~.

int_fast16_t i = 10; 
int_16_t j = 10; 

if (~i != ~j) { 
    // scary !!! 
} 

Bằng cách nào đó, tôi muốn cố ý sử dụng 32 bit hoặc 64 bit dựa trên độ rộng gốc của bộ xử lý.