![]() |
|
Модераторы: bsa |
![]()
|
|
| Compositum |
|
||||||||||||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Попробовал с глобальными...
Результат
Результат:
Не понял... процесс был "убит" операционной системой? Если да, то почему?
Результат:
Как видим, в последнем случае откомпилировалось и отработало без ошибок, но на компиляцию ушло секунд 7... Почему в случае с локальной переменной это не сработало, а с глобальной - получилось? |
||||||||||||
|
|||||||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Локальная переменная располагается в стеке, а его размер ограничен. Глобальная - в обычной виртуальной памяти. Ее размер ограничен только доступной виртуальной памятью (кстати, на 64х битной машине размер виртуальной память меньше - 48 бит) Так что long туда не влез (он занимает 63-64 бита адреса), а int влез (он занимает 31-32 бита) Но учти, что система может иметь свои взгляды на размер памяти, и прибить процесс, который попытается реально обратится к слишком большому объему памяти. Когда кончится своп файл процесс получит sigfault |
|||
|
||||
| Compositum |
|
||||||||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Спасибо за ответы. Ты пишешь, что размер стека ограничен, а чем обуславливаются размеры/ограничения стека? Я думал, что размер стека вычисляется компилятором на основе размеров переменных, используемых в программе. Я ошибся? Ещё я ведь могу объявить переменную как
В этом случае она будет видна только в рамках этого си-файла - такая переменная так же будет размещаться в обычной виртуальной памяти или в стеке (компилируется и работает без сообщений об ошибке)? Насчёт размера виртуальной памяти не понял - ты имеешь в виду размер указателя на ячейку памяти?
получаю: 8. Т.е. размер указателя - 64 бита. Это сообщение отредактировал(а) Compositum - 1.6.2011, 21:26 |
||||||||
|
|||||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Добавлено через 2 минуты и 51 секунду ты не путай размер указателя и разрядность виртуальной памяти. У указателя много места занимает выравнивание, которое необходимо, чтобы процессор быстрее считывал из памяти (т.е. считывание 8 байт с адреса, выравненного по 8 (addr % 8 == 0) займет 1 машинную операцию, а считывание с невыравненного - 2). |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Указатель действительно 64 бита, но могут быть нюансы. Например для x86 64х битной архитектуры обычно только младшие 48 битов (точное количество зависит от процессора) значимые. А оставшиеся старшие биты (64-48=16) должны совпадать друг с другом и с последним значащим битом (47м). В противном случае при попытке что либо прочесть/записать по такому указателю получите ошибку сегментации. Т.е. виртуальное адресное пространство действительно 64х битное, но в его середине есть дыра весьма приличного размера |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |