Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Уверен. Генерация кода вещь хотя и хрупкая, но не в данном... 10.03.05 14:22 Число просмотров: 2778
Автор: Heller <Heller> Статус: Elderman
|
> Никто как бы и не удивлен тем, что информация о типах > теряется при компиляции. Вообще то если кто не заметил, мы > говорили не о том, что БУДЕТ РАБОТАТЬ (если бы вопрос > ставился таким образом, достаточно было бы одного теста), а > о том, что БОЛЬШЕ СООТВЕТСВУЕТ СТАНДАРТУ
> А ты уверен, что это не поменятеся в будущем? Чем ближе ты > находишься к существующему стандарту, тем меньше > вероятность, что комитет по стандартизации в будущем > поломает твою программу.
Уверен. Генерация кода вещь хотя и хрупкая, но не в данном конкретном случае. Я не вижу более оптимальных вариантов для построения кода (хотя при сравнении float'а с нулём компилятор и строит хрень какую-то - cmp или test были бы и проще и эффективнее - но это я уже склонен списывать на баги Майкрософта).
> > отличаются только иструкцией je вместо jne. При этом > > А вот тут по фигу - кодогенерация весьма хрупкая штука (не > в смысле что может сломаться, а в смысле что при малейшем > телодвижении может давать совершенно другой код). А все > потому, что оптимальная кодогенерация - NP-полная задача и > для ее решения используются эвристические итерационные > методы которые в пределе должны сходиться к оптимальному > результату. В теории. На практике всегда можно предугадать какой именно код построит компилятор. Естесственно, что он использует умные методы оптимизации, однако в таких вещах как я показал оптимизировать физически нечего.
Немного оффтоп, хотя и в тему, но вот вы писали в топике про ООП, что, мол, компилятор строит эффективный код, который часто не по силам человеку. http://bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=2&m=115940 - уже было подобное обсуждение. Да и то что я привёл с float'ом при сравнении с нулём опять же не тянет на "не по силам человекам". Я бы такое сравнение писал проще и лучше. Мелочь, но однако.
> > Си'шный тип (указатель/не указатель, char/не char) > вообще > > оказывается не существенным. > > А почему по твоему она называется статической типизацией (в > отличие от динамической)? Почему оно так называется понятно. Но что касается Си, то он уж через чур "статический". Хоть убейте, но я не понимаю зачем вообще разделять указатели. Какая разница, указывает он на int, char или вообще на другой указатель? Только что бы программист сам при программировании не запутался? Как-то это сомнительно.
Ну да про стандарт. Я решил обратиться по вопросу NULL'а к Страуструпу:
----------------
Ноль (0) имеет тип int. Благодаря стандартным преобразованиям (§ В.6.2.3), 0 можно использовать в качестве константы любого интегрального типа (§ 4.1.1), типа с плавающей точкой, указателя или указателя на член класса. Тип нуля определяется по контексту. Ноль, как правило (но не всегда), будет физически представлен в виде последовательности нулевых битов соответствующей длины.
Гарантируется, что нет объектов с нулевым адресом. Следовательно, указатель, равный нулю, можно интерпретировать как указатель, который ни на что не ссылается.
В языке С было очень популярно определять макрос NULL для представления такого нулевого указателя. Так как в С++ типы проверяются более жёстко, использование банального нуля вместо NULL приведёт к меньшим проблемам. Если вы чувствуете, что просто обязаны определить NULL, воспользуйтесь
const int NULL = 0;
Модификатор const (§ 5.4) предотвращает ненамеренное замещение NULL и гарантирует, что NULL можно использовать везде, где требуется константа.
----------------
Думаю, теперь все вопросы прояснились. NULL - нулевой указатель. Тип, на что именно NULL указывает, не важен. Просто указатель на ноль. Если для вас и Страуструп не стандарт, то я уж и не знаю :-)
|
|
|