незваный гость писал(а):
Это очень сильное утверждение. Верное далеко не всегда и далеко не всюду. Во-первых, не компилятор, а библиотека. Во-вторых, библиотека может и не взаимодействовать с осью.
Во-первых, полностью согласен, что
malloc - функция библиотечная.
Во-вторых, в моем сообщении есть доля моей аппроксимации, но аппроксимации разумной. Не представляю, как библиотека может не взаимодействовать с современными ОС при работе с памятью. Точнее представляю два варианта:
1. Заранее резервируется некоторый ограниченный объем памяти под кучу, и за пределы этого объема программа вылезти не может -
malloc возвратит
NULL при запросе памяти большего объема, чем доступен в данный момент в куче.
2. Происходит попытка занять всю доступную память для данной программы. Ну это бред по определению
.
Под современной ОС я подразумеваю ОС, которая не позволяет занимать память авторитарно, без ее, ОС, ведома, т.е. защищенную.
Таким образом, я прихожу к выводу, что функции динамического выделения и освобождения памяти на современном этапе развития вычислительной техники, просто обязаны тесно взаимодействовать с ОС в этом вопросе.
незваный гость писал(а):
Я плохо знаю стандарт С++, и потому не уверен — должен ли по умолчанию new() транслироваться в вызов malloc() или не должен.
Я тоже не знаю, но опять таки, исходя из логики, не думаю, что обязан. Ибо
new - это оператор, поведение которого (неперегруженного) должно оставаться предсказуемым и идентичным в рамках хотя бы данного компилятора, что не будет осуществляться при использовании иной ф-ии malloc. Вообще,
malloc - это Си,
new - рекомендуемая ему замена в Си++, при этом
new лучше
malloc тем, что позволяет осуществить проверку типов, и, в общем-то, вообще отказаться от применения
void *.
незваный гость писал(а):
Просто знание стандарта — это весьма специфическое знание. Оно, несомненно, нужно разработчику компилятора и библиотеки. А дальше? Не знаю. Знание именно стандарта языка необходимо при написании переносимых программ — там много разных компиляторов.
Я стараюсь писать изначально переносимый код, даже если в данный момент это не требуется в проекте. Просто в любой момент может взять да и потребоваться
.
Конечно, глубоко стандарты не изучал, многое уже забылось, но все-таки, именно переносимость кода ставлю одним из первых требований. Иначе, мы отказываемся от одного из главных преимуществ Си/Си++ - его реализаций практически на всех платформах. Тогда бы я уж предпочел что-то более красивое - Яву напиример, для спец. задач - python, php, perl и т.д. и т.п.
Но вообще-то я имел ввиду не стандарты, а Си++ вообще. Когда почитал книжку Джеффа Элджера "C++", то понял, что, как недавно сказали на Баше, "я знаю Си++, но не знаю как писать на нем программы"
.
Такого накрутить можно, причем накрутить обоснованно, что дух захватывает. Используется масса тонкостей, которые программисты не применяют почти никогда (во всяком случае, мой опыт говорит об этом).
Поэтому я и задаю вопрос - сколько людей вообще используют ООП/Си++, оперируя тенденциями, которые общество по развитию Си++ (или как там оно называется) ежегодно придумывает и обосновывает?
Не могу не сказать о Borland'цах - они в Builder'e вообще отключили множественное наследование от vcl-классов(!). Также повсеместно нарушается принцип инкапсулировани и т.д.
Такие дела...