Как узнать какие элементы были изменены функцией?

156
20 ноября 2019, 20:50

Задача может показаться странной, но у нее есть практическое применение.

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

Требуется внешними (относительно функции ChangeValue, сама функция для нас черный ящик) средствами определить какие элементы были изменены.

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

Реализуемо ли:

Отслеживание на уровне системных страниц?

Передача в функцию имитатора изменяемого массива?

Запуск в виртуальной среде?

и т.д.

Ниже приведен пример программы:

    void ChangeValue(int * values) {
    // работает как черный ящик
    // мы не знаем ТОЧНО какие элементы меняет эта функция
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR, int)
{
    while (true) {
        int values[100000000] = {0};
        ChangeValue(values);
        // здесь требуется узнать какие элементы были изменены
    }
    return 0;
}
Answer 1

PAGE_GUARD - хорошее решение. В случае, если в массиве изменяется не более 10% данных перехват исключений, связанных с PAGE_GUARD дает двукратное увеличение скорости.

Правильный же ответ: пользоваться функциями GetWriteWatch и ResetWriteWatch. Это предоставляемый системой способ отслеживания изменения памяти на уровне страниц. Работает максимально быстро.

READ ALSO
Полоса прокрутки на форме в Qt?

Полоса прокрутки на форме в Qt?

Как добавить полосу прокрутки на форму в Qt? Добавил verticalScrollBar на формуКак его активировать? Подскажите пожалуйста)

101
Ошибка исполнения задачи [закрыт]

Ошибка исполнения задачи [закрыт]

Выдает ошибку исполнения задачиУ меня на компиляторе все результаты тестов совпадают, а система выдает "ошибка исполнения"

140
Как правильно описать бизнес процесс (ddd)?

Как правильно описать бизнес процесс (ddd)?

Есть бизнес, в котором пользователь, зарегистрировавшись (используя почту и пароль) может получить консультацию специалиста в неком чате

136
Плагин на C++ который запускает код на Java

Плагин на C++ который запускает код на Java

Есть известная игра CS:GO в которой можно хостить свои сервера и добавлять на них плагиныЭти плагины пишутся на C++ (plugin wiki), существует даже проект...

117