Как выделение памяти сделано для переменных в языках сценариев?

Вы можете найти соответствующий код на SO. Например, приведенный ниже код rand_int() основан на коде для целых чисел в ответе на . Верна ли эта реализация на С тасования Фишера-Йейтса? (и, в частности, ответ от [ 116] Роланд Иллиг ):

static size_t rand_int(size_t n)
{
    size_t limit = RAND_MAX - RAND_MAX % n;
    size_t rnd;

    while ((rnd = rand()) >= limit)
        ;
    return rnd % n;
}

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

Вы также можете найти некоторые внешние ссылки в массиве Shuffle в C .

6
задан Real Red. 24 February 2009 в 15:20
поделиться

2 ответа

Python использует технику, названную подсчетом ссылок, который в основном помещает счетчик в значение. Каждый раз, когда ссылка на значение создается, счетчик увеличен. Когда ссылка на значение потеряна (например, при присвоении нового значения 'x') значение постепенно уменьшается. Когда счетчик достигает нуля, который означает, что никакая ссылка на значение не существует, и это может быть освобождено. Это - упрощенное объяснение, но это - по крайней мере, основы.

3
ответ дан 17 December 2019 в 18:20
поделиться

Ну, те переменные являются ссылками на неизменные строки, которые выделяются во время компиляции.

Конечно, это зависит от VM, но в целом, я думаю, языки сценариев самые на базе С выделяют большой блок памяти, разворачивая его по мере необходимости и делают их собственное выделение в этом, крайне редко отдавая что-либо к O/S. Особенно на лексически ограниченном по объему языке, который почти все они, переменные все выделяются динамично в этом блоке, не на чем-либо аналогичном стеку C, и они освобождены или с подсчетом ссылок или со сборщиком "мусора".

Если Ваш язык сценариев работает на JVM, или.NET или чем-то как он (Попугай?), создавание переменной является просто созданием чего-то как объект Java. Некоторое время после больше нет ссылок на объект, сборщик "мусора" исправит память.

0
ответ дан 17 December 2019 в 18:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: