Я работаю над проектом AVM Atmel в настоящий момент, и startet удивляется, какой из этих двух методов использует меньше памяти. Я работаю с 8-битным Atmel Atmega328. У меня есть значение, которое мне нужно передать во множество внешних функций (вне класса).Разработка с ограниченной памятью
Случай 1: Используйте макрос препроцессора:
#define MY_VALUE 0x10
class MyClass
{
public:
MyClass ();
void myMethod ();
void myMethod2 ();
};
// Constructor
void MyClass::myMethod ()
{
externalFunction (MY_VALUE);
}
void MyClass::myMethod2 ()
{
externalFunction2 (MY_VALUE);
}
Случай 2: Используйте Const статическое значение:
class MyClass
{
public:
const static uint8_t MY_VALUE = 0x10;
MyClass ();
void myMethod ();
void myMethod2 ();
};
// Constructor
void MyClass::myMethod ()
{
externalFunction (MyClass::MY_VALUE);
}
void MyClass::myMethod2 ()
{
externalFunction2 (MyClass::MY_VALUE);
}
Или существует ли она более эффективные методы для redusing использования памяти.
Вопрос 2: То же, что и более, но вместо uint8_t
мы используем uint16_t
или uint32_t
?
Скомпилированный результат будет зависеть от вашего компилятора, но это школьный пример микрооптимизации. Например. если 'externalFunction' принимает' int', то '0x10' в первом примере будет скомпилирован как' int' (предполагая 'sizeof (int) == 2' на вашем 8-битном контроллере, он получит дополнительный байт). Если прототип принимает 'uint8_t', то, вероятно, не будет различий. Но я настоятельно рекомендую вам не тратить свою энергию на такие детали. – Groo
gnu objdump в binutils отображает эту информацию, см. Https://sourceware.org/binutils/docs-2.26/binutils/objdump.html#objdump. – Gregg
Используйте C, а не C++, для систем с ограниченными ресурсами, таких как AVR. – JimmyB