Защитите отдельные значения в std::array, позволяя при этом полную перезапись. ⇐ C++
-
Anonymous
Защитите отдельные значения в std::array, позволяя при этом полную перезапись.
У меня есть массив с глобальным состоянием. Это работает во встроенной среде/микроконтроллере, а не в большом приложении, где меня больше беспокоило бы глобальное состояние.
Как я могу объявить массив так, чтобы его члены не могли быть изменены, но при этом я мог обновить копию и при этом полностью перезаписать глобальный массив, когда это необходимо?
Я заинтересован в использовании неизменяемого массива, чтобы можно было быстро проверить, изменился ли он, когда он возвращается из функции мутации. То есть если адрес памяти изменился, то я знаю, что его скопировали и обновили.
Если он был обновлен, я хочу перезаписать исходный глобальный массив обновленной версией.
Однако я хочу защитить отдельные значения массива от случайной перезаписи в main() или от случайного доступа к глобальному массиву и его непосредственного обновления. Возможно, я параноик, но ради вопроса скажем, что это вполне обоснованная проблема.
Единственные обновления, которые должны быть возможны, должны выполняться через обновление копии/адреса.
Эта версия работает, но можно получить доступ к глобальному массиву и напрямую обновить его:
#include #include std::array arr = {1, 2, 3}; // глобальный массив std::array const * mutate(std::array const * ptr) { // (*ptr)[2] = 9; // Мне нравится, как это предотвращается с помощью const // возвращаем ПТР; // раскомментируем, чтобы проверить отсутствие мутаций // мутация посредством копирования, сохранение нового массива в куче std::array * ret = new std::array; std::copy((*ptr).begin(), (*ptr).end(), (*ret).begin()); (*рет)[0] = 9; вернуть возврат; } интервал основной() { std::array const * retPtr = mutate(&arr); если (retPtr == &arr) { std::cout
У меня есть массив с глобальным состоянием. Это работает во встроенной среде/микроконтроллере, а не в большом приложении, где меня больше беспокоило бы глобальное состояние.
Как я могу объявить массив так, чтобы его члены не могли быть изменены, но при этом я мог обновить копию и при этом полностью перезаписать глобальный массив, когда это необходимо?
Я заинтересован в использовании неизменяемого массива, чтобы можно было быстро проверить, изменился ли он, когда он возвращается из функции мутации. То есть если адрес памяти изменился, то я знаю, что его скопировали и обновили.
Если он был обновлен, я хочу перезаписать исходный глобальный массив обновленной версией.
Однако я хочу защитить отдельные значения массива от случайной перезаписи в main() или от случайного доступа к глобальному массиву и его непосредственного обновления. Возможно, я параноик, но ради вопроса скажем, что это вполне обоснованная проблема.
Единственные обновления, которые должны быть возможны, должны выполняться через обновление копии/адреса.
Эта версия работает, но можно получить доступ к глобальному массиву и напрямую обновить его:
#include #include std::array arr = {1, 2, 3}; // глобальный массив std::array const * mutate(std::array const * ptr) { // (*ptr)[2] = 9; // Мне нравится, как это предотвращается с помощью const // возвращаем ПТР; // раскомментируем, чтобы проверить отсутствие мутаций // мутация посредством копирования, сохранение нового массива в куче std::array * ret = new std::array; std::copy((*ptr).begin(), (*ptr).end(), (*ret).begin()); (*рет)[0] = 9; вернуть возврат; } интервал основной() { std::array const * retPtr = mutate(&arr); если (retPtr == &arr) { std::cout
Мобильная версия