Здравствуйте, emusic, Вы писали:
E>Охренеть. А что еще может сделать C++ runtime столь же неявно?
Из того, что в описаниях библиотечных функций не оговорено, что эти функции не изменяют значений "левых" переменных, делаем вывод, что перед вызовом каждой функции нам нужно сохранять в файле значения всех глобальных переменных, а после возврата — восстанавливать?
Стековый кадр, надеюсь, C++ runtime без спроса корежить не станет?
Шутки-шутками, но допустим, я захотел, чтобы моя программа использовала мою функцию strlen. Я не описываю ее прототипа, т.к. он определен в <cstring>, просто прилинковываю к программе еще один obj или lib. Но задачей моей strlen, кроме основной работы, может быть, скажем сбор статистики. Или strlen помещает последнюю вычесленную длину в глобальную переменную, чтобы она была доступна без повторного обращения к strlen. Или кэширует адреса строк и их длины для того, чтобы повторно не вычислять длину той же самой строки. Для этого моя strlen модифицирует какие-либо глобальные данные. Которые могут быть определены даже в другой lib-е. Так вот мне интересно, имеет ли право компилятор, встретив где-то в коде strlen посчитать, что он все знает про эту функцию (она же из стандартной библиотеки) и оптимизировать все, что находится вокруг нее? Причем меня волнует компилятор, который, пока, делает основную оптимизацию, а не линкер, который-то явно будет знать, что strlen не стандартная.
Пример с strlen может быть и притянут с потолка. Но почему такого не может быть с malloc/free/realloc? Ведь предоставление своих версий глобальных new и delete является распространенной практикой.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>