Saat menggunakan C / C ++ pada platform lain, int
tipenya biasanya 4 byte (atau berpotensi lebih). Namun, pada Arduino, hanya 2 byte.
Kenapa berbeda? Apakah itu mempengaruhi kinerja jika saya selalu menggunakan 4 byte long
saja?
programming
c++
data-type
performance
Peter Bloomfield
sumber
sumber
int
4 byte pada Arduino Due. Ashort
akan menjadi 2 byte pada semua Ardunios yang ada, tetapi saya menekankan saran orang lain untuk menggunakanint16_t
atauuint16_t
.Jawaban:
ATmega328 yang digunakan di banyak Arduinos adalah mikrokontroler 8-bit. Ini berarti bahwa register adalah 8-bit, bus data adalah 8-bit, porta adalah 8-bit. Ada beberapa aspek minimal 16-bit untuk sistem (misalnya salah satu timer), tetapi hampir semuanya 8-bit.
Oleh karena itu, sebagian besar operasi menangani 8-bit sekaligus. Bekerja pada apa pun kecuali 8-bit (yaitu bilangan bulat 16-bit atau 32-bit dan angka floating point) membutuhkan apa yang pada dasarnya dapat digambarkan sebagai emulasi perangkat lunak, di mana kompiler menggunakan beberapa instruksi untuk mengerjakan variabel-variabel yang lebih besar ini.
8-bit jelas memadai untuk mengatasi port 8-bit. Ini juga cukup untuk berurusan dengan banyak loop counters, mengembalikan nilai, dan karakter ASCII. Itu tidak benar-benar cukup ketika berhadapan dengan angka. Int 8-bit yang ditandatangani (int8_t) hanya dapat mewakili -128 -> +127. Tidak ditandatangani (uint8_t) hanya dapat mewakili 0 -> 255.
Bilangan bulat 8-bit cukup terbatas. C / C ++ int harus mewakili setidaknya -32.678 -> +32.767 sehingga peta ke int16_t - ukuran terkecil yang akan melakukannya. Ini memberikan keseimbangan jangkauan dan efisiensi yang baik. Ini sangat penting ketika pemula sedang belajar - meluap bukan benar-benar sesuatu yang non-programmer mengerti.
Namun ada dampak kinerja dari melakukan ini, karena sebagian besar operasi 16-bit membutuhkan setidaknya dua kali lebih lama dari operasi 8-bit, dan menggunakan register dua kali lebih banyak. Ini mungkin atau mungkin tidak membuat perbedaan bagi Anda.
Banyak dari kita beralih ke tipe asli seperti int8_t dan uint8_t karena memberi Anda kontrol lebih jauh.
sumber
int
adalah 32-bit! arduino.cc/en/Reference/intSatu fakta penting tentang bahasa C dan C ++ adalah bahwa standar masing-masing tidak menentukan ukuran (dalam byte) dari tipe angka integral dan angka mengambang.
Mereka hanya mendefinisikan rentang minimal dan hubungan antara rentang ini, misalnya
Jadi ukuran eg
int
akan biasanya tergantung pada:sumber
sizeof(short) == sizeof(int) == sizeof(long)
itu mungkin?sizeof(short) < sizeof(long)
.