При використанні C / C ++ на інших платформах int
тип, як правило, становить 4 байти (або потенційно більше). Однак на Arduino це лише 2 байти.
Чому це різне? Чи впливає це на продуктивність, якщо я завжди використовую 4 байти long
замість цього?
При використанні C / C ++ на інших платформах int
тип, як правило, становить 4 байти (або потенційно більше). Однак на Arduino це лише 2 байти.
Чому це різне? Чи впливає це на продуктивність, якщо я завжди використовую 4 байти long
замість цього?
Відповіді:
ATmega328, який використовується в багатьох Arduinos, є 8-бітовим мікроконтролером. Це означає, що регістри є 8-бітними, шина даних - 8-бітовою, порти - 8-бітними. У системі є мінімальні 16-бітні аспекти (наприклад, один із таймерів), але майже все є 8-бітним.
Тому більшість операцій одночасно обробляють 8-бітні. Робота над чим-небудь, крім 8-бітових (тобто 16-бітних або 32-бітових цілих чисел та чисел з плаваючою комою), вимагає того, що по суті може бути описано як емуляція програмного забезпечення, де компілятор використовує кілька інструкцій для роботи над цими більшими змінними.
8-біт очевидно достатній для адреси 8-бітового порту. Досить також мати справу з багатьма лічильниками циклів, значеннями повернення та символами ASCII. Це насправді недостатньо, хоча при роботі з цифрами. Підписаний 8-розрядний int (int8_t) може представляти лише -128 -> +127. Непідписаний (uint8_t) може представляти лише 0 -> 255.
8-бітні цілі числа є досить обмежуючими. C / C ++ int повинен представляти щонайменше -32,678 -> +32,767, тому карти на int16_t - найменший розмір, який це зробить. Це дає хороший баланс дальності та ефективності. Це особливо важливо, коли початківці навчаються - переповнення насправді не те, що розуміють непрограмісти.
Однак це має вплив на продуктивність, оскільки більшість 16-бітних операцій займають щонайменше вдвічі довше, ніж 8-бітова операція, і використовують вдвічі більше регістрів. Це може не вплинути на вас.
Багато з нас переходять на рідні типи, такі як int8_t та uint8_t, оскільки це дає набагато більше контролю.
int
32-бітний! arduino.cc/en/Reference/int
Важливим фактом щодо мов C та C ++ є те, що їхні відповідні стандарти не визначають розмір (у байтах) інтегральних типів та типів з плаваючою комою.
Вони просто визначають мінімальні діапазони та відношення між цими діапазонами, наприклад
range(short) <= range(int) < range(long)
Отже, розмір, наприклад, int
заповіту, як правило, залежить від:
sizeof(short) == sizeof(int) == sizeof(long)
це можливо?
sizeof(short) < sizeof(long)
.
int
це 4 байти на Arduino Due. Ashort
буде 2 байти на всіх існуючих Ardunios, але я наголошую на порадах інших щодо використанняint16_t
абоuint16_t
.