![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| GIK |
|
||||
![]() Добрый человек ![]() ![]() Профиль Группа: Участник Сообщений: 985 Регистрация: 3.6.2005 Где: я только не небыв ал Репутация: 1 Всего: 14 |
Собственно вопрос, и все будет видно если откомпилить код ниже.
почему адреса указателей на char имеют такую маркировку.
Вобщем вместо символа % непонятный знак, а вместо | , какаято стрелка ЗЫ. Почему отсчет памяти начинается с 1,24 мегабайт, когда оператива 512 метров. Нежели так мало выделяется? Если что сильно не пинать, за глупый вопрос. -------------------- Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!! Программирование - это не деятельнось! Программирование - это состояние души! Бог - самый крутой программист. |
||||
|
|||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Когда по правую сторону от "cout <<" находится переменная типа char*, компилятор думает, что ты хочешь вывести строку... Про ASCIIZ-строки что-нибудь слышал? (подробности в ВикипедиИ: нуль-терминированная строка и строковый тип). Вот у тебя и пашет он непаханное поле, пока на нуль-символ '\0' не наткнется... Поможет явное приведение указателя к типу void*:
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| witex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 16.10.2006 Где: Эстония Репутация: 0 Всего: 4 |
А почему бы и нет! Здесь че зависит нет ограничения.. не только твоя программа спользует оперативную программу. Операционка выделяет тебе конкретную ячейку памяти! которая в данный момент свободна.. ну и ессесно ближе к началу. З.Ы. вроде так, если я не ошибаюсь.. поправте если что! --------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. |
|||
|
||||
| GIK |
|
||||
![]() Добрый человек ![]() ![]() Профиль Группа: Участник Сообщений: 985 Регистрация: 3.6.2005 Где: я только не небыв ал Репутация: 1 Всего: 14 |
Понятно.
А что, если приложению нужно будет больше памяти? Можно распределение как-то регулировать с помошью средств C++? Или это в булдере делается? -------------------- Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!! Программирование - это не деятельнось! Программирование - это состояние души! Бог - самый крутой программист. |
||||
|
|||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Для большинства задач памяти будет более чем достаточно - счет идет на гигабайты, так что не переживайте.
|
|||
|
||||
| W4FhLF |
|
||||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Это виртуальные адреса, а не физические, поэтому ни о каких 1.24 мегабайтах речь идти не может. Реальное физическое смещение участка памяти в оперативной памяти может быть и на 300 метрах, при это в программе оно может указывать на "1.24 метра".
Распределение регулируется системой, при этом ты можешь это контролировать на уровне API функций. Выделение может идти как из кучи(HeapAlloc) и созданием нового участка в оперативной памяти(VirtualAlloc), и выделением памяти в свопе(MMF). -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
||||
|
|||||
| GIK |
|
||||
![]() Добрый человек ![]() ![]() Профиль Группа: Участник Сообщений: 985 Регистрация: 3.6.2005 Где: я только не небыв ал Репутация: 1 Всего: 14 |
Подробнее эти два момента можно обсудить? -------------------- Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!! Программирование - это не деятельнось! Программирование - это состояние души! Бог - самый крутой программист. |
||||
|
|||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Ну а что тут обсуждать?
Ключевые слова: Memory Mapped File CreateFileMapping, MapViewOfFile, OpenFileMapping Небольшая цитата из туторов ICZELION'a:
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
При трансляции кода на ассемблере (который был получен компилятором в процессе кодогенерации) выбирается некоторая база для каждой из секций (данных, кода, стека) и относительно этой базы ведется дальнейшая работа. Например для кода это может быть 0x00000000, для данных 0x08000000 и т. д. Каждая команда в секции кода (или участок памяти в секции данных) имеет смещение относительно бызы, следующая команда - относительное смещение предыдущей команды + ее размер (аналогично для данных) и т. д. При загрузке программы операционной системой в большинстве случаев для процесса, в котором работает программа, создается таблица преобразования виртульных адресов (диапозоны значений этих виртуальных адресов обычно прописываются в заголовках исполняемых файлов) в физические (обычно такой трансляцией занимается аппаратное MMU). У каждого процесса - своя таблица преобразования и свое физическое адресное пространство. Виртуальные же пространства адресов различных процессов могут перекрываться или вообще быть одинаковыми. При попытке обратится по произвольному адресу, например
в большинстве случаев сгенерируется аппаратное исключение типа PF (Page Fault) (говорю об архитектуре IA-32) из-за того, что доступ к странице, которой соответствует данный адрес после преобразования, запрещен или из-за того, что отображение вовсе отсутствует -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Аппаратное исключение может возникнуть только в случае обращения к этим адресам из драйера, в случае обращения к адресам выше 0x7FFFFFFF из программы режима пользователя(о чём сейчас и идёт речь) возникает системное прерывание, ибо данные и код находящиеся по адресу выше приведённого доступны только на уровне ядра. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| GIK |
|
|||
![]() Добрый человек ![]() ![]() Профиль Группа: Участник Сообщений: 985 Регистрация: 3.6.2005 Где: я только не небыв ал Репутация: 1 Всего: 14 |
Про память понятно, узнал много нового.
Мне бы примерчик с этими функциями. -------------------- Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!! Программирование - это не деятельнось! Программирование - это состояние души! Бог - самый крутой программист. |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
что за константа? по типу __PAGE_OFFSET только в винде? что за системное прерывание? про исключения:
это вызовет именно аппаратное исключение и передачу управления на соответствующий обработчик, который уже реализуется ОС -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| BreakPointMAN |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
MSDN, Рихтер... -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||
|
|||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Всё дело в том, что в NT системах идёт чёткое разделение памяти на: адресное пространство пользовательского уровня(от 0x00010000 до 0x7FFFFFFF), это пространство для каждого процесса своё и системное адресное пространство(от 0x800000000 до 0xFFFFFFFF), это пространство для всей системы и всех процессов одно, в нём находятся все драйвера, ядро системы, кеш и все управляющие структуры. Причём код, которые находится в пользовательском пространстве выполняется на 3 кольце привелегий, а код находящий в систмемном адресном пространстве выполняется на нулевом кольце привелегий. Отсюда следует, что если из 3 кольца ты попытаешься обратиться к адресу выше 0x7FFFFFFF, то возникнет исключение, но не аппаратное, а системное, т.е. система просто не даст обратиться к этому адресу, независимо есть ли эта страница в памяти или её нет. Другое дело, если ты обратишься к тому же участку памяти и нулевого кольца, тут уже будет всё зависеть от наличия данной страницы в памяти или её аттрибутов, и если произошло исключение, и на него небыл поставлен обработчик, то можно откинуться на спинку кресла и подождать пока система перезагрузиться Это сообщение отредактировал(а) W4FhLF - 22.12.2006, 10:16 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Lycifer |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 4.11.2007 Репутация: нет Всего: нет |
BreakPointMAN - компилятор не думает, он компилирует (смотрить реализацию STL)
witex - Попровляю, операционка пулет память, и выделение память происход на свободную память твоего процесса(Windows 32 bit это 2 гига наверное уже мало, но это вопрос другой) GIK - если память не хватает то операционка лезит на жёсткий диск - это учень медленно работает в Linux видел что производительность обращения памяти падает в 30 раз, и на это много причин W4FhLF- API это косвенное имеет этношения к С++, здесь речь идёт к прямому отношения к С++, а вообще ты прав, но только для новичка может это не много сложновато, хотя... GIK - указатель(лубой стековый объект) помещается в память по мере раскрутки стека, стека своя адрессация которая только косвенно связано с кучей, ну вот кучей управляется ОС, а стеком закгрусчик бинарного файла |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |