Я новичок в программировании микроконтроллеров, но знаю, что чем меньше памяти я использую, тем лучше (очевидно, у микроконтроллера мало оперативной памяти)
Итак, я хочу знать, как лучше всего создать новый экземпляр некоторого класса (более быстрый способ/способ, который использует меньше памяти)
Я пробовал использовать оба способа:
Общий класс:
class MyClass
{
public:
MyClass()
{
//generic constructor
}
};
теперь, как лучше всего объявить новый экземпляр MyClass
?
этот:
MyClass my_class_instance;
или это:
MyClass *my_class_instance_ptr = new MyClass;
Например, какой из них использует меньше памяти/быстрее?
изменить: под «меньше памяти/быстрее» я ожидал ответа типа «это быстрее, но использовать больше памяти» или что-то в этом роде, я знаю, что в программировании иногда нам нужно «пожертвовать» некоторой памятью, чтобы иметь большую скорость обработки
Кроме того, избегайте голых new
в своем коде. Используйте интеллектуальные указатели, когда вам действительно нужно динамическое выделение.
более быстрый способ/способ, который использует меньше памяти" - пожалуйста, выберите один. Иногда эти цели совместимы, но нередко скорость можно получить за счет места и наоборот.
Просто для ясности: вам интересно, что из следующего требует меньше места: 1) создать объект вашего класса или 2) создать объект вашего класса плюс указатель на этот объект? Не учитывать, как объект будет использоваться (что может изменить ответ), только пространство, необходимое для строительства?
Другим недостатком MyClass *my_class_instance_ptr = new MyClass
является то, что позже необходимо выполнить явное delete my_class_instance_ptr
, чтобы избежать утечки памяти. Это включает в себя дополнительный код, который также часто влияет на использование памяти (например, процессом). Однако более важно то, что вы задаете неправильный вопрос. Динамическое выделение памяти само по себе не имеет ничего общего с оптимизацией использования памяти. Это связано с тем, как необходимо управлять временем жизни объекта (например, должен ли объект существовать вне области, в которой он создан).
В программировании микроконтроллеров динамическое выделение памяти может быть вообще недоступно (в конце концов, если у вас есть 1 КБ памяти pf, резервирование ее части для некоторой бухгалтерии памяти, которая вам может даже не понадобиться, является огромной тратой).
На ваш вопрос нет правильного ответа. Объект MyClass всегда будет занимать один и тот же объем памяти для хранения. Что более важно для встроенного устройства, так это то, где хранится объект, то есть: в глобальной памяти, в стеке, в динамической памяти (если доступно) или, что реже, в памяти, специфичной для процессора, или для вашего оборудования. .
Я думаю, что этот вопрос связан с тем, что я не знаю разницы между stack
и heap
. Пожалуйста, используйте эти ключевые слова, чтобы провести исследование.
По сути, размещение в стеке с помощью MyClass my_class_instance;
— самый быстрый способ.
Arduino не имеет внешней памяти, поэтому с технической точки зрения память кучи и стека идентична. Однако выделение в куче требует некоторой фоновой работы, такой как поиск следующей свободной области памяти нужного размера.
Очень общее правило — избегать выделения кучи на небольших встроенных системах.
Понятие памяти стека и кучи даже не имеет отношения к стандартному C++. Они относятся к конкретным реализациям (конкретным платформам и наборам инструментов, предназначенным для этих платформ). Исторически сложилось так, что определенные платформы имели сегментированную память, в которой стек и куча использовали физически разные схемы и физическую память, а стек состоял из небольшого объема быстрой памяти и кучи (относительно) большего объема более медленной памяти. На современных платформах это различие обычно спорно, и — если не писать оптимизирующий компилятор или операционную систему — программисты излишне беспокоятся об этом.
@Peter: понятия стека и кучи почти такие же, как автоматическое и динамическое хранилище C++, которые очень актуальны в стандартном C++. Различие между ними не имеет отношения ни к чему в этом вопросе.
MyClass my_class_instance;
работает быстрее и требует меньше памяти.MyClass my_class_instance;
размещает экземпляр в стеке.MyClass *my_class_instance_ptr = new MyClass;
размещает указатель в стеке и экземпляр в куче.