реклама на сайте
подробности

 
 
> MMU - сильно ли надо?
Dimchansky
сообщение May 12 2006, 08:29
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 10-07-05
Пользователь №: 6 685



Люди добрые,

подскажите, насколько нужен MMU, если хотелось бы писать программу на нормальном C++ (не EC++) и использовать простые выделения памяти типа new delete?
Go to the top of the page
 
+Quote Post
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 37)
aaarrr
сообщение May 12 2006, 09:03
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Совершенно не нужен, если не планируется использовать Linux или WinCE.
Go to the top of the page
 
+Quote Post
Dimchansky
сообщение May 12 2006, 09:08
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 10-07-05
Пользователь №: 6 685



Цитата(aaarrr @ May 12 2006, 10:03) *
Совершенно не нужен, если не планируется использовать Linux или WinCE.

Linux, WinCE не нужен.
Т.е., если будет подключена внешняя SDRAM, к примеру, то я смогу спокойно писать на С++ что-то типа:
TMyArray* arr = new TMyArray(1000);
...
delete arr;
и всё будет спокойно выделяться во внешней памяти и освобождаться (при соответствующих настройках проекта)?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 12 2006, 09:36
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Да, для этого достаточно просто heap правильно прописать.
Go to the top of the page
 
+Quote Post
Dimchansky
сообщение May 12 2006, 09:36
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 10-07-05
Пользователь №: 6 685



Цитата(aaarrr @ May 12 2006, 10:36) *
Да, для этого достаточно просто heap правильно прописать.


Понял. Спасибо.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 12 2006, 10:11
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dimchansky @ May 12 2006, 12:08) *
Т.е., если будет подключена внешняя SDRAM, к примеру, то я смогу спокойно писать на С++ что-то типа:
TMyArray* arr = new TMyArray(1000);
...
delete arr;
и всё будет спокойно выделяться во внешней памяти и освобождаться (при соответствующих настройках проекта)?

Только учтите, что это 'счастье' до поры до времени, ведь никто не будет дефрагментировать память после Ваших фокусов с new/delete, да и сам new будет в случае нехватки памяти ждать ее до опупения....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dimchansky
сообщение May 12 2006, 10:30
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 10-07-05
Пользователь №: 6 685



Цитата(zltigo @ May 12 2006, 11:11) *
Только учтите, что это 'счастье' до поры до времени, ведь никто не будет дефрагментировать память после Ваших фокусов с new/delete, да и сам new будет в случае нехватки памяти ждать ее до опупения....


Как-то сразу об этом не подумал..
Т.е. в случае чего прийдется писать свой аллокатор для мелких объектов по типу, как у Александреску, или просто разумно использовать new.
Go to the top of the page
 
+Quote Post
makc
сообщение May 12 2006, 10:59
Сообщение #8


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Цитата(zltigo @ May 12 2006, 14:11) *
Только учтите, что это 'счастье' до поры до времени, ведь никто не будет дефрагментировать память после Ваших фокусов с new/delete, да и сам new будет в случае нехватки памяти ждать ее до опупения....


Если мне не изменяет память, то new/delete работают через стандартные аллокаторы, которые основаны на вызовах malloc/free, т.е. фрагментация памяти будет зависеть от того, как эти функции реализованы в стандартной библиотеке. Ну или на худой конец можно будет просто написать свои аллокаторы. wink.gif


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 12 2006, 11:38
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(makc @ May 12 2006, 13:59) *
Если мне не изменяет память, то new/delete работают через стандартные аллокаторы, которые основаны на вызовах malloc/free

Несомнено и с точки зрения дефрагментации использование malloc не лучше.
А вот то, что из new не предусмотрен возврат в случае отсутствия памяти, это дополнительный
прикол :-)
Цитата
Ну или на худой конец можно будет просто написать свои аллокаторы. wink.gif

Слишком мало смайликов на мой взгляд добавлено....
И как быть в этом случае с бесполезностью MMU???


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dimchansky
сообщение May 12 2006, 11:43
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 10-07-05
Пользователь №: 6 685



Цитата(zltigo @ May 12 2006, 12:38) *
Слишком мало смайликов на мой взгляд добавлено....
И как быть в этом случае с бесполезностью MMU???

Извините, что вмешиваюсь в интеллектуальную беседу. smile.gif
А с MMU не было бы проблем c фрагментацией памяти?
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 12 2006, 11:52
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dimchansky @ May 12 2006, 14:43) *
А с MMU не было бы проблем c фрагментацией памяти?

Без дефрагментатора - аналогичные.
Но ведь дефрагментатор предлагалось писать? Ну и как без аппаратной поддержки реализовать "перемещение" памяти да так, что-бы тот, кто этой памятью пользуется не догадался об этом?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dimchansky
сообщение May 12 2006, 11:59
Сообщение #12


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 10-07-05
Пользователь №: 6 685



Цитата(zltigo @ May 12 2006, 12:52) *
Без дефрагментатора - аналогичные.
Но ведь дефрагментатор предлагалось писать? Ну и как без аппаратной поддержки реализовать "перемещение" памяти да так, что-бы тот, кто этой памятью пользуется не догадался об этом?


Я просто не очень понял слова "бесполезностью MMU".. Просто я не до конца понимаю силу слов MMU.
А без аппаратной поддержки перемещение, наверное, можно было бы софтово обеспечить: каждый класc в обязательном порядке наследуется от какого-нибудь THeapObject, который внутри себя хранил бы уже реальный указатель, число ссылок и т.п., а про new и указатели забываем совсем. smile.gif
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение May 12 2006, 12:12
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(aaarrr @ May 12 2006, 12:03) *
Совершенно не нужен, если не планируется использовать Linux или WinCE.


есть uClinux, он именно для работы без MMU и придуман.
Go to the top of the page
 
+Quote Post
dxp
сообщение May 12 2006, 12:14
Сообщение #14


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(zltigo @ May 12 2006, 18:38) *
А вот то, что из new не предусмотрен возврат в случае отсутствия памяти, это дополнительный
прикол :-)

Зато оно исключение кидает. Это в случае ПКшных (т.е. наиболее массовых) программ удобнее, чем проверять каждый раз возвращаемое значение.

Для ембеддед, ессно, использовать стандартные аллокаторы, имхо, не самая хорошая идея, лучше уж написать свой простенький менеджер памяти на основе блоков фиксированного размера. Тут, по крайней мере, не сложно обеспечить предсказуемое поведение.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
makc
сообщение May 12 2006, 12:18
Сообщение #15


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Цитата(zltigo @ May 12 2006, 15:38) *
Цитата

Ну или на худой конец можно будет просто написать свои аллокаторы. wink.gif

Слишком мало смайликов на мой взгляд добавлено....
И как быть в этом случае с бесполезностью MMU???


MMU в этом случае может очень даже пригодиться, если хочется сделать "дефрагментации" малой кровью. Но если отказаться в рамках С++ от работы с указателями и управление динамической памятью сделать с помощью собственнаручно созданных аллокаторов (которые могут кроме всего прочего реализовывать прозрачную дефрагментацию и сборку мусора), то можно будет обойтись и без MMU.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Dimchansky
сообщение May 12 2006, 12:28
Сообщение #16


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 10-07-05
Пользователь №: 6 685



Цитата(makc @ May 12 2006, 13:18) *
MMU в этом случае может очень даже пригодиться, если хочется сделать "дефрагментации" малой кровью.

А как будет в этом случае выглядет дефрагментация?
Go to the top of the page
 
+Quote Post
makc
сообщение May 12 2006, 14:43
Сообщение #17


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Цитата(Dimchansky @ May 12 2006, 16:28) *
Цитата(makc @ May 12 2006, 13:18) *
MMU в этом случае может очень даже пригодиться, если хочется сделать "дефрагментации" малой кровью.

А как будет в этом случае выглядет дефрагментация?


С помощью MMU можно реализовать непрерывное логическое адресное пространство из нескольких малых физических блоков памяти по разным физическим адресам. Т.е. произвести определяемую менеджером памяти (с функцией дефрагментации) трансляцию логических адресов в физические.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Dainis
сообщение May 12 2006, 16:16
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 251
Регистрация: 23-06-04
Пользователь №: 154



MMU нужен инициализыровать если для ARM9 хочется включить Data-Cache.
Go to the top of the page
 
+Quote Post
Dimchansky
сообщение May 12 2006, 20:15
Сообщение #19


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 10-07-05
Пользователь №: 6 685



Цитата(makc @ May 12 2006, 15:43) *
С помощью MMU можно реализовать непрерывное логическое адресное пространство из нескольких малых физических блоков памяти по разным физическим адресам. Т.е. произвести определяемую менеджером памяти (с функцией дефрагментации) трансляцию логических адресов в физические.


Т.е., в приципе, можно и не производить дефрагментацию?
Go to the top of the page
 
+Quote Post
DASM
сообщение May 13 2006, 03:37
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Zltigo - не пугайте людей.
new в случае неуспеха вернет нулл. 1) "If unsuccessful, new returns zero or throws an exception"
2) " specified in the C++ standard, which is to throw a std::bad_alloc exception if the memory allocation fails"
Go to the top of the page
 
+Quote Post
makc
сообщение May 13 2006, 05:17
Сообщение #21


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Цитата(Dimchansky @ May 13 2006, 00:15) *
Цитата(makc @ May 12 2006, 15:43) *
С помощью MMU можно реализовать непрерывное логическое адресное пространство из нескольких малых физических блоков памяти по разным физическим адресам. Т.е. произвести определяемую менеджером памяти (с функцией дефрагментации) трансляцию логических адресов в физические.


Т.е., в приципе, можно и не производить дефрагментацию?


В принципе да, но многое будет зависеть от особенностей MMU.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 13 2006, 07:08
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(DASM @ May 13 2006, 06:37) *
Zltigo - не пугайте людей.
new в случае неуспеха вернет нулл. 1) "If unsuccessful, new returns zero or throws an exception"
2) " specified in the C++ standard, which is to throw a std::bad_alloc exception if the memory allocation fails"

Господь с авторм приведенной Вами цитаты, но ни при каких условиях new не может возвращать NULL. В 'нормальном' варианте cо свопами и прочими наворотами просто циклится в ожидании появления памяти и в случае если и это не удается - система может просто прибить задачу. В мелких системах, где более-менее сразу ясно, что памяти скорее всего не появится - exeption. В самых примитивных реализациях - просто вечный цикл. Но никак не NULL'.
Ну а то, что автору, цитаты, что NULL, что 'zero' все едино - еще раз указывает на его некомпетентность.



Цитата(makc @ May 13 2006, 08:17) *
В принципе да...

Ага битик включил и "само работать будет" - не будет :-(. Это только механизм, которым можно воспользоваться в менеджере памяти для РЕАЛИЗАЦИИ компенсации фрагментированости.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
DASM
сообщение May 13 2006, 08:04
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



ну это я с переводом лопухнулся. По умолчанию генерируется исключение bad_alloc. Вызовом set_new_handler() мы можем назначить иное поведение. Это по Страуструпу. Ну уж если он некомпетентен.... Вот из MSDN "If unsuccessful, new returns zero or throws an exception; see The new and delete Operators for more information. You can change this default behavior by writing a custom exception-handling routine and calling the _set_new_handler run-time library function with your function name as its argument"
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 13 2006, 08:49
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(DASM @ May 13 2006, 11:04) *
ну это я с переводом лопухнулся. По умолчанию генерируется исключение bad_alloc. Вызовом set_new_handler() мы можем назначить иное поведение. Это по Страуструпу. Ну уж если он некомпетентен....

С этим согласен. Если установить new_handler возвращающий NULL, то new() возвратит результат
NULL. Вопросы:
1.Вы когда-нибудь его переустанавливали?
2.Мы обсуждаем поведение new() или того что МОЖНО сделать из new() установкой new_handler,
перегрузкой или написанием макроса new ???

Цитата
Вот из MSDN "If unsuccessful, new returns zero ....

А вот на это "MS" ссылаться не надо. Из того, что у них в Windows на 32 разрядном x86
#define NULL 0
никоем образом не следует, то NULL являющийся абстрактным нулевым _указателем_ может всегда, везде и на всех платформах использоваться как попало и его физическое представление 0.
Не говоря о том, что размеры указателя могут ОТЛИЧАТЬСЯ от разрядности ЧИСЛА.
И в любом случае писать, что функция которая по определению возвращает УКАЗАТЕЛИ
вернула не УКАЗАТЕЛЬ а число 0 (или три или любое другое) некорректно в принципе.

Что касается путаницы и самой возможности использовать 0 как NULL, то за это отдельное спасибо
авторам С, которые вместо отдельного ключевого слова для нулевого указателя типа паскалевского "nil" использовали ключевое слово "0" :-(. Потом ANSI выкрутились через макрос NULL,
который всетаки был в С определен как УКАЗАТЕЛЬ.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
DASM
сообщение May 13 2006, 10:34
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



хорошо, если не переустанавливать set_new_handler, то какие пакеты вызовут зацикливание в new а не выброс исключения ? Приведите пожалуйста список, дабы я (а может и еще кто) никогда их (эти пакеты) не использовали
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 13 2006, 11:07
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(DASM @ May 13 2006, 13:34) *
Приведите пожалуйста список, дабы я (а может и еще кто) никогда их (эти пакеты) не использовали

Разбираться как ведет себя new() в конкретной библиотеке это задача того, кто решил его использовать.
Я лично - не использую. Мне лет 15-17 назад хватило BCC, дабы отбить сие желание.
Лет пять назад копался в ЧУЖОМ линуксовом приложении которое аккуратно периодически
молча отстреливалось системой как зависшее. Догадались что там было?
Ну и самое главное - чем Вам "exception" буде он реализован во EMBEDDED приложении сильно поможет? А? Типа "перезагрузимся и сделаем вид, что ни ничего не случилось".


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Alex03
сообщение May 15 2006, 05:23
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



new() практически во всех ранних C++ компиллерах умел возращать NULL.

Многие нынешние компиляторы/библиотеки поддерживают конструкцию:

Код
#include <new>
...
    T* p = new (std::nothrow) T;
    if(!p)
    {
    ... // не дали памяти гады!
    }
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 15 2006, 07:23
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Alex03 @ May 15 2006, 08:23) *
умел возращать NULL
....
Многие поддерживают конструкцию
....

О чем и речь :-(, что кто-то, где-то, как-то...
Посему, либо разбираться конкретно :-( и не забывать о повторных разборках при портировании,
либо устанавливать свой new_handler(), причем единственным разумным вариантом
new_handler() для embedded предстваляется возвращение им NULL для возможности максимально безболезненого выхода из каждого конкретной ситуации.
Либо не использовать new() в принципе.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 4 2006, 07:56
Сообщение #29


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(zltigo @ May 13 2006, 11:49) *
А вот на это "MS" ссылаться не надо. Из того, что у них в Windows на 32 разрядном x86
#define NULL 0
никоем образом не следует, то NULL являющийся абстрактным нулевым _указателем_ может всегда, везде и на всех платформах использоваться как попало и его физическое представление 0.
А вот тут zltigo не прав. Цитирую Страуструпа:
Цитата
Ноль (0) имеет тип int. Благодаря стандартным преобразованиям, 0 можно использовать в качестве константы любого интегрального типа, типа с плавающей точокй, указателя или указателя на член класса. Тип нуля определяется по контексту. Ноль, как правило (но не всегда), будет физически представлен в виде последовательности нулевых битов соответствующей длины.
Гарантируется, что нет объектов с нулевым адресом. Следовательно, указатель, равный нулю, можно интерпретировать как указатель, который ни на что не ссылается.
В языке С было очень популярно определять макрос NULL для представления такого указателя. Так как в С++ типы проверяются более жестко, использование банального нуля вместо NULL приведет к меньшим проблемам. Если вы чувствуете, что просто обязаны определеить NULL, воспользуйтесь
Код
    const int NULL = 0;
Модификатор const предотвращает ненамеренное замещение NULL и гарантирует, что NULL можно использовать везде, где требуется константа.

Так что ноль вполне законен и даже очень правилен. Кстати, IAR 4.30 после вызова new проверяет R0 на ноль и если не ноль вызывает конструктор. Глубже не копал, но интуитивно понял что new таки в случае неудачи возвращает ноль. Счас отловлю другие ошибки и попробую организовать нехватку памяти.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 4 2006, 08:26
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Сергей Борщ @ Aug 4 2006, 10:56) *
А вот тут zltigo не прав. Цитирую Страуструпа:

Это всего лишь личное мнение Страуструпа :-)))) который и затвердил :-( его в своей реализации ++.
Я не слишком слежу за процессом стандартизации C++, но похоже комитет пока еще не родил
стандарта :-(.
В моей полной цитате речь шла о проблеме более широко:
- не только по отношению к C++, но и к C (более того это был именно кусок по С );
- по отношению к разным платформам, как например должен выглядеть Страуструповский
0 на платформе типа Cray-Cyber с кольцевыми указателями?
Короче в С++ болезнь вместо лечения ( введением ключевого слова, как в Паскале) была загнана вовнутрь наложением исскуственного требования иметь внутреннее представление нулевых указателей нулевым. И с легкостью необыкновенной считать, что ключевое слово для нулевого указателя это "0".


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dxp
сообщение Aug 4 2006, 09:12
Сообщение #31


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(zltigo @ Aug 4 2006, 15:26) *
Цитата(Сергей Борщ @ Aug 4 2006, 10:56) *

А вот тут zltigo не прав. Цитирую Страуструпа:

Это всего лишь личное мнение Страуструпа :-)))) который и затвердил :-( его в своей реализации ++.
Личное мнение Страуструпа является стандартом - он автор. smile.gif

Цитата(zltigo @ Aug 4 2006, 15:26) *
Я не слишком слежу за процессом стандартизации C++, но похоже комитет пока еще не родил
стандарта :-(.

Стандарт давно принят - аж в 1998 году. Уже приличное время ходят обсуждения следующей версии.

Цитата(zltigo @ Aug 4 2006, 15:26) *
Короче в С++ болезнь вместо лечения ( введением ключевого слова, как в Паскале) была загнана вовнутрь наложением исскуственного требования иметь внутреннее представление нулевых указателей нулевым. И с легкостью необыкновенной считать, что ключевое слово для нулевого указателя это "0".

Какая болезнь? Отказ от определения NULL, как (void*)0? Сказано же, что объектов по нулевому адресу быть не может, поэтому указатель с адресом 0 невалиден. И 0 вполне однозначно определяет ситуацию благодаря стандартному преобразованию типа. Зачем тут плодить лишние сущности языка?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 4 2006, 09:51
Сообщение #32


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(zltigo @ Aug 4 2006, 11:26) *
В моей полной цитате речь шла о проблеме более широко:
- не только по отношению к C++, но и к C (более того это был именно кусок по С );
- по отношению к разным платформам, как например должен выглядеть Страуструповский
0 на платформе типа Cray-Cyber с кольцевыми указателями?
А разве в С есть operator new?
Про Cray не знаю ничего кроме "Цыпленок Cray перебежит дорогу быстрее всех, но если перед стартом его не окунуть в жидкий азот, то на той стороне дороги он появится в уже зажаренном виде" :-) На другой платформе int 0 будет стандартно преобразован к принятому на той платформе битовому представлению указателя который никуда не указывает. По-моему так! (с) Винни-Пух.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 4 2006, 10:46
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(dxp @ Aug 4 2006, 12:12) *
Какая болезнь? Отказ от определения NULL, как (void*)0?

Нет, отсутствие ключевого слова для нулевого указателя.
Цитата
Сказано же, что объектов по нулевому адресу быть не может...

Так папа сказал. Аминь.
А нежели кому в железе чего такого захочется сотворить:
Цитата
На другой платформе int 0 будет стандартно преобразован к принятому на той платформе битовому представлению указателя который никуда не указывает.

Ну не "int 0" а ключевое слово "0", которое выглядит как "0", но должно быть преобразовано к
"принятому на той платформе битовому представлению"... И пусть со всем этим компилятор разбирается и не ошибается... И программист пусть не думает, поскольку за него компилятор постарается
разобраться. Не по душе мне такой уровень абстракции :-(


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Concorde
сообщение Aug 4 2006, 12:07
Сообщение #34


Участник
*

Группа: Свой
Сообщений: 56
Регистрация: 5-07-05
Пользователь №: 6 553



Цитата(zltigo @ Aug 4 2006, 14:46) *
Нет, отсутствие ключевого слова для нулевого указателя.

Интересно, а физически что же из себя будет представлять это ключевое слово ? 0 или какое-нибудь 0xFFFF... ? Уровень языка (достаточно низкий) и подразумевает изпользование константы. И большое спасибо, а то бы получился очередной паскаль.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 4 2006, 13:08
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Concorde @ Aug 4 2006, 15:07) *
Интересно, а физически что же из себя будет представлять это ключевое слово ? 0 или какое-нибудь 0xFFFF... ?

Какая разница какое( ну NIL ). Любое, главное не строились мутные на мой взгляд преобразования типа "ничего не возвратили" поскольку вообще-то оттуда возвращают указатели, то будем считать,
что возвратили "никакой указатель" далее считаем, что по никакому указателю лежит "ничего"
ну а дальше просто пусть это ничего будет "0" - так и запишем :-(
Цитата
И большое спасибо, а то бы получился очередной паскаль.

Вы часом меня не за преверженца Паскаля да еще в его Борландовской реинкарнации приняли? Отвечу - нет, что отнюдь не заставляет меня априори его не признавать и не замечать его
отдельные достоинства в части четкости выражения.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dxp
сообщение Aug 4 2006, 13:51
Сообщение #36


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(zltigo @ Aug 4 2006, 17:46) *
Цитата(dxp @ Aug 4 2006, 12:12) *

Какая болезнь? Отказ от определения NULL, как (void*)0?

Нет, отсутствие ключевого слова для нулевого указателя.

Если так хоцца слово, то Вы можете его сами себе сотворить по вкусу - Сергей Борщ приводил цитату, там как раз было именно это. Заодно снимаются вопросы о самом слове - какое хоцца, такое и используйте. Вполне гибко и демократично. А в языке слова нет просто потому, что оно реально не нужно. Это лишняя сущность. Язык С++ и без этого достаточно сложен и чрезвычайно перегружен, поэтому сделано по минимуму. Все логично. А для принципиальных любителей слов оставлена лазейка. "И овцы сыты, и волки целы" (с) smile.gif

Цитата(zltigo @ Aug 4 2006, 17:46) *
Цитата

Сказано же, что объектов по нулевому адресу быть не может...

Так папа сказал. Аминь.

Ну, если папа - Деннис Ричи, то да. smile.gif

Цитата(zltigo @ Aug 4 2006, 17:46) *
Цитата

На другой платформе int 0 будет стандартно преобразован к принятому на той платформе битовому представлению указателя который никуда не указывает.

Ну не "int 0" а ключевое слово "0", которое выглядит как "0", но должно быть преобразовано к
"принятому на той платформе битовому представлению"... И пусть со всем этим компилятор разбирается и не ошибается... И программист пусть не думает, поскольку за него компилятор постарается
разобраться. Не по душе мне такой уровень абстракции :-(

Мни кажется, что Вы все-таки излишне драматизируете ситуацию. Все там вполне однозначно. И физическое представление нулевого указателя вполне конкретно, просто оно определяется не Стандартом, а реализацией, только и всего, что опять же вполне логично. На всех платформах, с которым пришлось более-менее плотно поработать с С++, нулевой указатель имел физическое значение 0. Наличие специального ключевого слова совершенно ничего не меняет.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 4 2006, 16:45
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(dxp @ Aug 4 2006, 16:51) *
А для принципиальных любителей слов оставлена лазейка. "И овцы сыты, и волки целы" (с) smile.gif

И я ей пользуюсь :-) Ибо, как минимум, не люблю веспорядочно расскиданные по тексту "0" :-)
А вообще сыр-бор с уходом в сторону от темы new() в тему NULL начался с моей фразы:
Цитата
Ну а то, что автору, цитаты, что NULL, что 'zero' все едино - еще раз указывает на его некомпетентность.

При этом имелось ввиду отнюдь не способность компилятора разобраться в контексте, а покоробившее меня поминание именно "0" вместо "нулевого указателя" в качестве значения возврашаемого функцией для которой возврашаемым значением является указатель. Я понимаю,
что в данной MS инструкции (а это именно четкая фраза от MS - можете поиском воспользоваться) указывается прямое действие пользователю - "пиши 0 и не парься", но тем не менее, подмена физической сущности в инструкции мне не нравится.

Цитата
Мни кажется, что Вы все-таки излишне драматизируете ситуацию.

Да нет, так - шероховатость, просто это привлекло неожиданно для меня самого повышенное внимание и понеслось....

Цитата
На всех платформах, с которым пришлось более-менее плотно поработать с С++, нулевой указатель имел физическое значение 0.

Аналогично :-). Нынеживущие платформы наверное все такие. Ну а в будующем? Не знаю даже.
Ведь всяких архитектур с ненулевыми нулевыми указателями и с указателями разных размеров для
разных типов указателей было немало. Это было в эпоху, когда за счет архитектурных ухищрений
добивались упрощения и/или увеличения производительности. Потом настали времена когда
"патронов не жалеть" (в смысле транзисторов) и мегагерцы гнались легко. Сейчас лафа кончается -
мегагерцы на исходе и пожалуй опять начнутся архитектурные гонки. И каким будет физическое представление нулевого указателя - это вопрос :-). Компиляторы конечно разберутся с "0" и в этом
случае, но не красиво это как-то. Вот собственно пожалуй и все по теме "0" и "нулевой указатель"
неожиданно вылезшей в теме по MMU.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 5 2006, 01:35
Сообщение #38


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



А вот мои 5 рублей.
Мне вот тоже не нравится такое неуважительное отношение к нулевому указателю. В Паскале, с которого я начинал это сделано более чем идеально. Ну а стандарт С++ из-за этого какой-то "кривой". (редко я соглашаюсь с zltigo)

Писал как-то свой менеджер памяти на 486 системе. Да ещё в защищенном 32-битном режиме. Так вот было два сегмента - один для данных, другой для служебной информации. И мне было ну очень удобно выделять память данных с самого нуля. Тогда же я условился считать пустым указателем 0xFFFFFFFF. Ну и с тех пор пытаюсь даже на СИ не путать указатели с числами и использовать NULL. Короче, смысл в этом есть.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 07:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01751 секунд с 7
ELECTRONIX ©2004-2016