История изменений
Исправление vbr, (текущая версия) :
Это всё понятно, но по факту new Bla()
это то же, что bla = malloc(sizeof(bla)); bla_init(bla);
и в плане сгенерированного кода отличий не будет. И на С человек напишет плюс-минус то же, т.е. разницы не будет. Инициализировать члены по умолчанию С++ не будет, если ты их не проинициализировал, там будет мусор. Если ты написал код, который инициализирует члены чем-то, то и его и на С напишешь, раз тебе это надо.
Собственно вот пример реализации из https://en.cppreference.com/w/cpp/memory/new/operator_new
void* operator new(std::size_t sz)
{
std::printf("1) new(size_t), size = %zu\n", sz);
if (sz == 0)
++sz; // avoid std::malloc(0) which may return nullptr on success
if (void *ptr = std::malloc(sz))
return ptr;
throw std::bad_alloc{}; // required by [new.delete.single]/3
}
Как видно, из тяжёлого тут только кидок исключения. Для эмбеддеда, конечно, это лучше заменить на что-то другое. А в остальном это буквально вызов malloc.
Исходная версия vbr, :
Это всё понятно, но по факту new Bla()
это то же, что bla = malloc(sizeof(bla)); bla_init(bla);
и в плане сгенерированного кода отличий не будет. И на С человек напишет плюс-минус то же, т.е. разницы не будет. Инициализировать члены по умолчанию С++ не будет, если ты их не проинициализировал, там будет мусор. Если ты написал код, который инициализирует члены чем-то, то и его и на С напишешь, раз тебе это надо.