|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
03.04.2012, 17:51 | #1 | ||
Новичок
Джуниор
Регистрация: 03.04.2012
Сообщений: 3
|
Странное выполнение кода.
Я только начал изучение программирования, поэтому представленный внизу код - это просто эксперимент для лучшего понимания процессов.
Цитата:
Цитата:
1. По идее на экран должны выводится адреса переменных aa,ab и ac. На первый взгляд это и происходит. Но дело в том, что адреса выводятся всё время одни и тежи, сколько бы раз не запускалась программа. Так ведь не может быть, чтоба Операционная Система всегда размещала переменные точно в одном и том же масте. Я даже пробовал специально занимать много памяти другими программами, чтобы эти адреса точно были заняты, но результат не меняется. В чём тут дело? Поясните кто понимает. 2.В коде все три переменные объявлены как signed short int. Значит под них должно быть выделено по два байта (16 бит). А в консоле мы видим, что для первой переменной (а) выделено 4 байта, а для второй (b) вообще 6 байт. Почему? |
||
03.04.2012, 18:30 | #2 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
1) У каждого приложения свое виртуальное адресное пространство.
И если в коде изменений нет, то почему бы переменным не занимать те же адреса. 2) Длина типа signed short int - действительно два байта. Но почему Вы решили что разброс адресов у двух подряд объявленных переменных должен в точности равнятся длине типа первой переменной? Вот если бы вы увидели что разница в адресах меньше длины типа, тогда был бы повод задуматься. Последний раз редактировалось EUGY; 03.04.2012 в 18:34. Причина: ) |
03.04.2012, 18:31 | #3 |
С++
Форумчанин
Регистрация: 22.09.2008
Сообщений: 791
|
2. Адреса написаны в шестнадцатиричной системе, разница между ними по 12 байт. У меня тот же код выделяет по два байта. Откуда разница - понятия не имею)
Форматируйте код, будьте людьми.
|
03.04.2012, 18:43 | #4 |
Форумчанин
Регистрация: 25.11.2010
Сообщений: 164
|
Да, как уже и сказал EUGY у каждого приложения своё адресное пространство. Проверяется это достаточно простым запуском одного и того же приложения дважды. Адреса будут одинаковы. По видимому вы пользуетесь Visual Studio. Попробуйте посмотреть, что вернёт вам ф-я sizeof(signed short int). У каждого компилятора своё мнение по поводу количества места занимаемого переменной определённого типа в оперативной памяти.
Возможно Я Быдлокодер ©.
Последний раз редактировалось t2skler; 03.04.2012 в 18:47. |
03.04.2012, 19:00 | #5 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
Есть подозрение, что в 32-разрядной системе даже char будет занимать 4 байта. Гарантировано стандартом только то, что размер short по меньшей мере составляет 2 байта, максимальный размер стандартом не ограничен.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
03.04.2012, 19:22 | #6 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
Гром, у автора сомнение, почему у него тип занимает два байта sizeof(short)==2
А адрес следующей переменной отличается от адреса первой больше чем на два байта. Как будто объявленные подряд переменные должны быть упакованой структурой. |
03.04.2012, 20:03 | #7 |
Новичок
Джуниор
Регистрация: 03.04.2012
Сообщений: 3
|
Попробовал создать массив из переменных и вывести их. В этом случае всё выводится правильно - если short, то 2 байта; если long, то 4 байта. Действительно, отдельные переменные, в отличие от массивов или структур, не обязаны стоять строго друг за другом. Это я как-то забыл. Потом сам сообразил. Однако, не понятно, почему мой компилятор ставит их так далеко друг от друга - аж 12 байт, а компилятор Granus'а: http://programmersforum.ru/showpost....56&postcount=3
чётко друг за другом. Я действительно пользуюсь Visual Studio. Видимо это особенности компилятора? Если я правильно понял, то виртуальное адресное пространство - это, как бы, "метка", которую ставит компилятор, и отсчитывает от неё размещение данных всего кода. И эта метка не имеет прямого отношения к реальным ячейкам памяти. |
03.04.2012, 20:10 | #8 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
ТС, в виртуальное адресное пространство вы вообще зря полезли.
а тот эффект что вы видите называеться "выравнивание данных". ответы: 1)так код то один и тот же, почему должно чтото меняться? точка входа та же самая, вершина стека там же, ничего по сути и не меняеться между запусками. Цитата:
а вот выравнивание данных не ограничено. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
03.04.2012, 20:19 | #9 | |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
Цитата:
ЗЫ. Не думаю, что это объясняется выравниванием. Последний раз редактировалось EUGY; 03.04.2012 в 20:27. |
|
03.04.2012, 23:54 | #10 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
скиньте код на котором есть эффект, и компилятор на котором он есть(в том числе параметры компилирования) я завтра проверю в дизасме почему так. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Выполнение кода Access из Excel | Konstantin1970 | Microsoft Office Access | 3 | 13.02.2012 12:02 |
Выполнение PHP кода | Sprat | PHP | 1 | 31.01.2012 15:12 |
Парсер, выполнение кода. | zumm | Общие вопросы Delphi | 27 | 30.06.2010 13:29 |
.htaccess запрет на выполнение кода | wall66 | PHP | 3 | 11.08.2009 10:54 |
Выполнение кода из файла.. | NSvirus | Паскаль, Turbo Pascal, PascalABC.NET | 25 | 14.06.2009 00:56 |