Оптимизация кода: лучше использовать "MyClass = instance;" или создать указатель на него? что быстрее/использует меньше памяти?

Я новичок в программировании микроконтроллеров, но знаю, что чем меньше памяти я использую, тем лучше (очевидно, у микроконтроллера мало оперативной памяти)

Итак, я хочу знать, как лучше всего создать новый экземпляр некоторого класса (более быстрый способ/способ, который использует меньше памяти)

Я пробовал использовать оба способа:

Общий класс:

class MyClass
{
public:
    MyClass()
    {
    //generic constructor
    }
};

теперь, как лучше всего объявить новый экземпляр MyClass?

этот:

MyClass my_class_instance;

или это:

MyClass *my_class_instance_ptr = new MyClass;

Например, какой из них использует меньше памяти/быстрее?

изменить: под «меньше памяти/быстрее» я ожидал ответа типа «это быстрее, но использовать больше памяти» или что-то в этом роде, я знаю, что в программировании иногда нам нужно «пожертвовать» некоторой памятью, чтобы иметь большую скорость обработки

MyClass my_class_instance; работает быстрее и требует меньше памяти. MyClass my_class_instance; размещает экземпляр в стеке. MyClass *my_class_instance_ptr = new MyClass; размещает указатель в стеке и экземпляр в куче.
Thomas Sablik 22.01.2023 23:15

Кроме того, избегайте голых new в своем коде. Используйте интеллектуальные указатели, когда вам действительно нужно динамическое выделение.

Thomas Sablik 22.01.2023 23:19

более быстрый способ/способ, который использует меньше памяти" - пожалуйста, выберите один. Иногда эти цели совместимы, но нередко скорость можно получить за счет места и наоборот.

JaMiT 23.01.2023 00:00

Просто для ясности: вам интересно, что из следующего требует меньше места: 1) создать объект вашего класса или 2) создать объект вашего класса плюс указатель на этот объект? Не учитывать, как объект будет использоваться (что может изменить ответ), только пространство, необходимое для строительства?

JaMiT 23.01.2023 00:03

Другим недостатком MyClass *my_class_instance_ptr = new MyClass является то, что позже необходимо выполнить явное delete my_class_instance_ptr, чтобы избежать утечки памяти. Это включает в себя дополнительный код, который также часто влияет на использование памяти (например, процессом). Однако более важно то, что вы задаете неправильный вопрос. Динамическое выделение памяти само по себе не имеет ничего общего с оптимизацией использования памяти. Это связано с тем, как необходимо управлять временем жизни объекта (например, должен ли объект существовать вне области, в которой он создан).

Peter 23.01.2023 00:35

В программировании микроконтроллеров динамическое выделение памяти может быть вообще недоступно (в конце концов, если у вас есть 1 КБ памяти pf, резервирование ее части для некоторой бухгалтерии памяти, которая вам может даже не понадобиться, является огромной тратой).

Revolver_Ocelot 23.01.2023 00:43

На ваш вопрос нет правильного ответа. Объект MyClass всегда будет занимать один и тот же объем памяти для хранения. Что более важно для встроенного устройства, так это то, где хранится объект, то есть: в глобальной памяти, в стеке, в динамической памяти (если доступно) или, что реже, в памяти, специфичной для процессора, или для вашего оборудования. .

Michaël Roy 23.01.2023 01:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что этот вопрос связан с тем, что я не знаю разницы между stack и heap. Пожалуйста, используйте эти ключевые слова, чтобы провести исследование.

По сути, размещение в стеке с помощью MyClass my_class_instance; — самый быстрый способ.

Arduino не имеет внешней памяти, поэтому с технической точки зрения память кучи и стека идентична. Однако выделение в куче требует некоторой фоновой работы, такой как поиск следующей свободной области памяти нужного размера.

Очень общее правило — избегать выделения кучи на небольших встроенных системах.

Понятие памяти стека и кучи даже не имеет отношения к стандартному C++. Они относятся к конкретным реализациям (конкретным платформам и наборам инструментов, предназначенным для этих платформ). Исторически сложилось так, что определенные платформы имели сегментированную память, в которой стек и куча использовали физически разные схемы и физическую память, а стек состоял из небольшого объема быстрой памяти и кучи (относительно) большего объема более медленной памяти. На современных платформах это различие обычно спорно, и — если не писать оптимизирующий компилятор или операционную систему — программисты излишне беспокоятся об этом.

Peter 23.01.2023 01:07

@Peter: понятия стека и кучи почти такие же, как автоматическое и динамическое хранилище C++, которые очень актуальны в стандартном C++. Различие между ними не имеет отношения ни к чему в этом вопросе.

Mooing Duck 24.01.2023 01:42

Другие вопросы по теме