Задача может показаться странной, но у нее есть практическое применение.
Задан достаточно большой массив, который в цикле постоянно изменяется функцией 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;
}
PAGE_GUARD - хорошее решение. В случае, если в массиве изменяется не более 10% данных перехват исключений, связанных с PAGE_GUARD дает двукратное увеличение скорости.
Правильный же ответ: пользоваться функциями GetWriteWatch и ResetWriteWatch. Это предоставляемый системой способ отслеживания изменения памяти на уровне страниц. Работает максимально быстро.
Продвижение своими сайтами как стратегия роста и независимости