Как я могу создать функцию is_prime, которая является общей для различных целочисленных типов?

На самом деле есть раздел в онлайн-учебнике OSTEP для обучения студентов в операционных системах, в котором точно указан ваш вопрос.

Соответствующий раздел - «Забыть о свободной памяти» в в главе Memory API на стр. 6, которая дает следующее объяснение:

В некоторых случаях может показаться, что не вызов free () является разумным. Например, ваша программа недолговечна и скоро выйдет; в этом случае, когда процесс умирает, ОС очистит все выделенные страницы, и, таким образом, утечка памяти не произойдет сама по себе. Хотя это, безусловно, «работает» (см. в сторону на стр. 7 ), это, вероятно, плохая привычка развиваться, поэтому будьте осторожны в выборе такой стратегии

blockquote>

. Этот фрагмент находится в контексте введения концепции виртуальной памяти. В основном на этом этапе книги авторы объясняют, что одной из целей операционной системы является «виртуализация памяти», то есть каждая программа считает, что она имеет доступ к очень большому адресному пространству памяти.

За кулисами операционная система будет переводить «виртуальные адреса», которые пользователь видит в фактических адресах, указывающих на физическую память.

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


EDIT: . Конец, упомянутый в выдержке, скопирован ниже.

ASIDE: ПОЧЕМУ НЕ УДАЛЕНА ПАМЯТЬ ПРОТИВ ПРОЦЕССА

Когда вы пишете короткий -lived, вы можете выделить некоторое пространство, используя malloc(). Программа запускается и собирается завершить: нужно ли free() вызвать кучу раз перед выходом? Хотя кажется неправильным, что никакая память не будет «потеряна» в каком-либо реальном смысле. Причина проста: в системе действительно два уровня управления памятью. Первый уровень управления памятью выполняется ОС, которая передает их в процессы, когда они запускаются, и возвращает их, когда процессы завершаются (или иначе умирают). Второй уровень управления находится внутри каждого процесса, например, внутри кучи, когда вы вызываете malloc() и free(). Даже если вам не удалось вызвать free() (и, таким образом, удалить память в куче), операционная система восстановит всю память процесса (включая эти страницы для кода, стека и, в зависимости от ситуации, кучу), когда программа закончен. Независимо от того, каково состояние вашей кучи в вашем адресном пространстве, ОС возвращает все эти страницы, когда процесс умирает, тем самым гарантируя, что память не будет потеряна, несмотря на то, что вы ее не освободили.

Таким образом, для недолговечных программ утечка памяти часто не вызывает никаких операционных проблем (хотя она может считаться плохой формой). Когда вы пишете долговременный сервер (например, веб-сервер или систему управления базами данных, которые никогда не выходят), утечка памяти является гораздо более серьезной проблемой и в конечном итоге приведет к сбою, когда в приложении закончится память. И, конечно, утечка памяти - еще более серьезная проблема внутри одной конкретной программы: самой операционной системы. Показывая нам еще раз: те, кто пишу код ядра, имеют самую сложную задачу для всех ...

из Страница 7 из Справочника по API главы

Операционные системы: три простых пьесы Ремзи Х. Арпачи-Дуссе и Андреа К. Арпачи-Дуссеу Книги Арпачи-Дуссо Март, 2015 г. (версия 0.90)

blockquote> blockquote>

29
задан Shepmaster 30 December 2015 в 20:51
поделиться

1 ответ

Работать с общими типами чисел может быть довольно неприятно, но как только вы их освоите, они не будут слишком плохими, хотя и немного более многословными. Стандартными строительными блоками для таких методов являются черты в ящике num от crates.io, в особенности Num , Zero и One , а также стандартные библиотеки std::cmp::PartialOrd .

Числовые литералы не могут быть универсальными для любого числового типа; они должны быть выполнены с помощью вызова метода trait; Zero::zero() и One::one() будет достаточно для большинства целей - здесь числа, которые мы хотим, это 0, 1, 2, 3, 5 и 6, которые в высшей степени достижимы с этими строительные блоки. Вы также можете создать свою собственную особенность с помощью статических методов, генерирующих эти значения, и реализовать их для любых числовых типов, которые вам нравятся, но лучше сделать это с помощью того, что гарантировано Num.

Основная процедура состоит в том, чтобы указать параметры вашего универсального типа как основанные на NumPartialOrd, если вы пишете неравенства для значений этого типа, таких как i * i <= n), и заменять любые числовые литералы на построенные от нуля до единицы, как показывает полдюжины let утверждений в начале метода, приведенного ниже. Обычно этого будет достаточно.

Вот что вы получите в итоге для этого конкретного метода:

// You’ll also need the appropriate dependencies.num addition to Cargo.toml
extern crate num;

use num::Num;

fn is_prime<N: Num + PartialOrd + Copy>(n: N) -> bool {
    let _0 = N::zero();
    let _1 = N::one();
    let _2 = _1 + _1;
    let _3 = _2 + _1;
    let _5 = _2 + _3;
    let _6 = _3 + _3;
    if n == _2 || n == _3 {
        return true;
    } else if n % _2 == _0 || n % _3 == _0 {
        return false;
    }

    let mut i = _5;
    let mut w = _2;
    while i * i <= n {
        if n % i == _0 {
            return false;
        }
        i = i + w;
        w = _6 - w;
    }
    true
}
25
ответ дан Shepmaster 30 December 2015 в 20:51
поделиться
  • 1
    Это работало на меня, я полагаю, что это было вызвано недавним обновлением JRE. – JJP 22 February 2019 в 09:13
  • 2
    Это работало на меня, я полагаю, что это было вызвано недавним обновлением JRE. – JJP 22 February 2019 в 09:13
  • 3
    Это работало на меня, я полагаю, что это было вызвано недавним обновлением JRE. – JJP 22 February 2019 в 09:13
  • 4
    Это работало на меня, я полагаю, что это было вызвано недавним обновлением JRE. – JJP 22 February 2019 в 09:13
  • 5
    Это работало на меня, я полагаю, что это было вызвано недавним обновлением JRE. – JJP 22 February 2019 в 09:13
Другие вопросы по тегам:

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