Подтвердить что ты не робот

Сбор мусора при компиляции на C

Каковы методы сбора мусора при компиляции сборника мусора на C? Я знаю два:

  • поддерживать теневой стек, который сохраняет все корни явно в структуре данных

  • используйте консервативный сборщик мусора, такой как Boehm's

Первый метод медленный, потому что вам нужно поддерживать теневой стек. Потенциально каждый раз, когда вызывается функция, вам необходимо сохранить локальные переменные в структуре данных.

Вторая техника также медленна и по своей сути не возвращает весь мусор из-за использования консервативного сборщика мусора.

Мой вопрос: что представляет собой современное состояние сбора мусора при компиляции C. Обратите внимание, что я не имею в виду удобный способ сделать сборку мусора при программировании на C (это цель сборщика мусора Boehm) просто способ сделать сборку мусора при компиляции на C.

4b9b3361

Ответ 1

Потенциально каждый раз, когда вызывается функция, вам необходимо сохранить локальные переменные в структуре данных.

Нет, вы не можете - вы можете оставить локальные переменные в стеке C и все равно перебирать их: поместите все ссылочные переменные в массив и добавьте указатель на это в связанный список, к которому вы добавите node при вводе нового фрейма стека.

Mockup:

struct vm
{
    struct scope *root;
};

struct scope
{
    struct scope *prev, *next;
    size_t size;
    struct ref *refs;
};

void foo(struct vm *vm, struct scope *caller)
{
    struct ref local_refs[42];
    struct scope scope = {
        caller, NULL, sizeof local_refs / sizeof *local_refs, local_refs };

    caller->next = &scope;

    // ...

    caller->next = NULL;
}

Однако вам нужно будет перепрыгнуть через некоторые крупные обручи, если вы хотите поддерживать продолжения/нелокальные прыжки. В этом случае проще кучи - выделить все.