Иногда мне приходилось создавать «пробную» версию функции.
В качестве простого примера: при разработке оценщика я мог бы захотеть выполнить предварительную оценку, чтобы увидеть, является ли текущая информации о зависимостях достаточно или нет. В этом случае я буду вызывать функцию eval так, как если бы она была пробной, т. е. меня интересует только ее возвращаемое значение bool, которое указывает на успех/неуспех. Самое главное, поскольку это всего лишь предварительная попытка, я хотел бы сохранить все в неизменном виде на протяжении всего выполнения, другими словами, никакие данные, такие как зависимость/счетчик/memoi/и т. д., не различаются до и после проверки.Теперь, если функция проверки достаточно проста, я, конечно, могу создать новую функцию, имитирующую старую, за исключением того, что каждая операция записи вместо этого выполняется в глубокой копии и т. д.
Однако, если функция имеет некоторые тысячи строк кода с переплетенной логикой. Писать новый уже нецелесообразно. Я могу полагаться только на систему регрессии, которая поможет выявить как можно больше проблем и принять на себя потенциальный риск.
Поэтому мне интересно
Есть ли какой-либо четко определенный способ добиться этого?
Можно ли использовать fork для реализации этого в Linux? то есть родительский процесс просто ничего не делает, а ждет дочерний процесс, дочерний выполняет функцию проверки и передает целевое значение родителю по каналу. Если моя память не так сильно заржавела, fork использует схему копирования при записи, поэтому она напоминает процесс, описанный выше, и я ожидаю, что накладные расходы будут относительно небольшими. Есть ли опасность при этом?
РЕДАКТИРОВАТЬ:
Как попытка сделать это вопрос более конкретный, я хотел бы применить некоторые ограничения к функции проверки:
Гарантируется, что такая функция каким-либо образом не взаимодействует с внешним процессом, т. е. нет сетевого сокета, нет RPC. Чтобы еще больше упростить, давайте предположим, что локального IPC не существует.
Эта функция не содержит ничего индетерминированного, т. е. не нужно беспокоиться о прикосновении к std::mt19937, curandstate и т. д.
Есть ли что-нибудь еще, чтобы прояснить этот вопрос? пожалуйста, научите.
Иногда мне приходилось создавать «пробную» версию функции. В качестве простого примера: при разработке оценщика я мог бы захотеть выполнить предварительную оценку, чтобы увидеть, является ли текущая информации о зависимостях достаточно или нет. В этом случае я буду вызывать функцию eval так, как если бы она была пробной, т. е. меня интересует только ее возвращаемое значение bool, которое указывает на успех/неуспех. Самое главное, поскольку это всего лишь предварительная попытка, я хотел бы сохранить все в неизменном виде на протяжении всего выполнения, другими словами, никакие данные, такие как зависимость/счетчик/memoi/и т. д., не различаются до и после проверки.Теперь, если функция проверки достаточно проста, я, конечно, могу создать новую функцию, имитирующую старую, за исключением того, что каждая операция записи вместо этого выполняется в глубокой копии и т. д. Однако, если функция имеет некоторые тысячи строк кода с переплетенной логикой. Писать новый уже нецелесообразно. Я могу полагаться только на систему регрессии, которая поможет выявить как можно больше проблем и принять на себя потенциальный риск. Поэтому мне интересно [list] [*]Есть ли какой-либо четко определенный способ добиться этого? [*]Можно ли использовать fork для реализации этого в Linux? то есть родительский процесс просто ничего не делает, а ждет дочерний процесс, дочерний выполняет функцию проверки и передает целевое значение родителю по каналу. Если моя память не так сильно заржавела, fork использует схему копирования при записи, поэтому она напоминает процесс, описанный выше, и я ожидаю, что накладные расходы будут относительно небольшими. Есть ли опасность при этом? [/list] [b]РЕДАКТИРОВАТЬ:[/b] Как попытка сделать это вопрос более конкретный, я хотел бы применить некоторые ограничения к функции проверки: [list] [*]Гарантируется, что такая функция каким-либо образом не взаимодействует с внешним процессом, т. е. нет сетевого сокета, нет RPC. Чтобы еще больше упростить, давайте предположим, что локального IPC не существует. [*]Эта функция не содержит ничего индетерминированного, т. е. не нужно беспокоиться о прикосновении к std::mt19937, curandstate и т. д. [*]Есть ли что-нибудь еще, чтобы прояснить этот вопрос? пожалуйста, научите. [/list]