Bei Verwendung von C / C ++ auf anderen Plattformen int
beträgt der Typ normalerweise 4 Byte (oder möglicherweise mehr). Auf Arduino sind es jedoch nur 2 Bytes.
Warum ist es anders? Beeinträchtigt es die Leistung, wenn ich long
stattdessen immer 4 Byte verwende?
programming
c++
data-type
performance
Peter Bloomfield
quelle
quelle
int
4 Bytes auf dem Arduino Due sind. Ashort
wird bei allen vorhandenen Ardunios 2 Byte groß sein, aber ich betone die Ratschläge der anderen,int16_t
oderuint16_t
.Antworten:
Der in vielen Arduinos verwendete ATmega328 ist ein 8-Bit-Mikrocontroller. Dies bedeutet, dass Register 8-Bit sind, der Datenbus 8-Bit ist, die Ports 8-Bit sind. Das System weist einige minimale 16-Bit-Aspekte auf (z. B. einen der Timer), aber fast alles ist 8-Bit.
Daher verarbeiten die meisten Operationen jeweils 8 Bit. Die Arbeit an etwas anderem als 8-Bit (dh 16-Bit- oder 32-Bit-Ganzzahlen und Gleitkommazahlen) erfordert eine Software-Emulation, bei der der Compiler mehrere Anweisungen verwendet, um diese größeren Variablen zu bearbeiten.
8-Bit ist offensichtlich ausreichend, um einen 8-Bit-Port zu adressieren. Es reicht auch aus, mit vielen Schleifenzählern, Rückgabewerten und ASCII-Zeichen umzugehen. Es ist jedoch nicht genug, wenn es um Zahlen geht. Ein vorzeichenbehaftetes 8-Bit-Int (int8_t) kann nur -128 -> +127 darstellen. Unsigned (uint8_t) kann nur 0 -> 255 darstellen.
8-Bit-Ganzzahlen sind ziemlich einschränkend. C / C ++ int muss mindestens -32.678 -> +32.767 darstellen, entspricht also int16_t - der kleinsten Größe, die dies tun wird. Dies ergibt ein gutes Gleichgewicht zwischen Reichweite und Effizienz. Dies ist besonders wichtig, wenn Anfänger lernen - Überlauf ist nicht wirklich etwas, was Nicht-Programmierer verstehen.
Dies hat jedoch Auswirkungen auf die Leistung, da die meisten 16-Bit-Operationen mindestens doppelt so lange dauern wie eine 8-Bit-Operation und doppelt so viele Register verwenden. Dies kann für Sie einen Unterschied machen oder auch nicht.
Viele von uns wechseln zu nativen Typen wie int8_t und uint8_t, da Sie dadurch weitaus mehr Kontrolle haben.
quelle
int
32-Bit! arduino.cc/en/Reference/intEine wichtige Tatsache bei C- und C ++ - Sprachen ist, dass ihre jeweiligen Standards nicht die Größe (in Bytes) von Integral- und Gleitkommazahlentypen definieren.
Sie definieren nur minimale Bereiche und Beziehungen zwischen diesen Bereichen, z
Die Größe eines Beispiels
int
hängt also normalerweise ab von:quelle
sizeof(short) == sizeof(int) == sizeof(long)
möglich ist?sizeof(short) < sizeof(long)
.