Встал вопрос а в каком случае значение константы может измениться Естественно расмматриваются исключительные ситуации Может кто подскажет когда такое бывает
Заранее благодарю
Здравствуйте MikaRSDN Soukhov, Вы писали:
MS>Встал вопрос а в каком случае значение константы может измениться Естественно расмматриваются исключительные ситуации Может кто подскажет когда такое бывает MS> Заранее благодарю
Рассмотрим функцию, которая ищет заданное значение в массиве
template <class T>
bool test (const T *begin, const T *end, T x)
{
while (begin != end)
if (*begin++ == x)
return true;
return false;
}
На каждой итерации совершается два сравнения: на достижение конца массива и на совпадение элементов. От первого сравнения можно избавиться следующим образом.
// вспомогательный класс, который предназначен для
// локализации "cнятия const".template <class T>
class SubstLock
{
const T _value;
const T * const _ptr;
public:
SubstLock (const T * p, const T& v)
: _value (*p)
, _ptr (p)
{
*const_cast<T*>(_ptr) = v;
}
~SubstLock()
{
*const_cast<T*>(_ptr) = _value;
}
};
template <class T>
bool test (const T *begin, const T *end, T x)
{
if (begin != end)
{
{
SubstLock <T> __(end-1,x);
while (*begin++ != x);
if (begin != end-1) return true;
}
return end[-1] == x;
}
return false;
}
С точки зрения вызывающей функции данные не изменяются, а на самом деле нам удобно подменить последний элемент массива, так что бы на нем всегда положительно проходила проверка на совпадение. Таким образом в проверке на достижение конца массива больше нет необходимости.
Если цикл выполняется довольно много раз, то можно получить выигрыш в скорости в несколько ассемблерных команд на один цикл.
Здравствуйте MikaRSDN Soukhov, Вы писали:
MS>Встал вопрос а в каком случае значение константы может измениться Естественно расмматриваются исключительные ситуации Может кто подскажет когда такое бывает MS> Заранее благодарю
Где-то ошибка, и кто-то мажет по памяти или какая-нибудь функция меняет const-объект...
Здравствуйте DarkGray, Вы писали:
DG>Здравствуйте MikaRSDN Soukhov, Вы писали:
MS>>Встал вопрос а в каком случае значение константы может измениться Естественно расмматриваются исключительные ситуации Может кто подскажет когда такое бывает MS>> Заранее благодарю
DG>Где-то ошибка, и кто-то мажет по памяти или какая-нибудь функция меняет const-объект...
DG>Этот код успешно меняет константу. DG>
Здравствуйте Аноним, Вы писали:
А>Этот код не меняет константу. Результат работы этой программы не определен.
В идеальном мире он ее может и не меняет, а вот в реальном — константа меняется,
и никто на это не ругается.
Re[4]: Изменение константы
От:
Аноним
Дата:
13.05.02 10:54
Оценка:
Здравствуйте DarkGray, Вы писали:
DG>Здравствуйте Аноним, Вы писали:
А>>Этот код не меняет константу. Результат работы этой программы не определен.
DG>В идеальном мире он ее может и не меняет, а вот в реальном — константа меняется, DG>и никто на это не ругается.
Это не имеет никакого значения. То, что константа в данном случае изменилась, просто один из вариантов неопределенного поведения. Кстати, писать void main() тоже ошибка.
Здравствуйте DarkGray, Вы писали:
DG>Здравствуйте Аноним, Вы писали:
А>>Этот код не меняет константу. Результат работы этой программы не определен.
DG>В идеальном мире он ее может и не меняет, а вот в реальном — константа меняется, DG>и никто на это не ругается.
В реальном это зависит от компилятора и его опций Вполне можешь GPF огрести, если константа сидит в read-only памяти.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте MikaRSDN Soukhov, Вы писали:
MS>Встал вопрос а в каком случае значение константы может измениться Естественно расмматриваются исключительные ситуации Может кто подскажет когда такое бывает MS> Заранее благодарю
Здравствуйте MikaRSDN Soukhov, Вы писали:
MS>Встал вопрос а в каком случае значение константы может измениться Естественно расмматриваются исключительные ситуации Может кто подскажет когда такое бывает MS> Заранее благодарю
1. из-за переполнения буфера, например после массива идет ваша константа, выход за границы массива испортит константу
2. можно взять адрес константы и по адресу что-то написать