LINUX.ORG.RU

История изменений

Исправление 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); и в плане сгенерированного кода отличий не будет. И на С человек напишет плюс-минус то же, т.е. разницы не будет. Инициализировать члены по умолчанию С++ не будет, если ты их не проинициализировал, там будет мусор. Если ты написал код, который инициализирует члены чем-то, то и его и на С напишешь, раз тебе это надо.