Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
VasilyS, вот обсуждали мы с тобой указатели, и ты все время ссылаешься на компилятор,
Отправлено
Двоешник (193.200.150.137) 08 мая 2010, г. 02:27
но не компилятор крутится в меге, а реальная программа!
и адреса переменных (указатели) лежат в оперативе контроллера.
Мне нужно знать как программа(не компилятор) управляет указателями!!!
После компиляции программа попадет в реальное железо, и алгоритмы программы могут работать с структурами совершенно непредсказуемо, ведь в проге могут быть циклы, условные операторы с проверкой каких-то внешних событий, ну короче нельзя при компиляции знать как будет происходить работа с указателями, зато можно знать сколько всего указателей и каких они типов.
Вот ты говоришь ,что можно получить через sizeof размер переменной, но согласись маловероятно ,что реальная программа в микроконтроллере будет тратить время на расчеты длины типа данных при каждом обращении к указателю!? Разумнее было бы сделать по другому.
Возможно я повторюсь, но у меня нет других соображений кроме как предположить два варианта:
а) в оперативе проца отводится ОДИН кусок памяти, под все указатели на все типы, и тогда физическая длинна данных лежит вместе с адресом
б) в оперативной памяти формируется несколько буферов под каждый тип указателей. можно предположить что первый элемент используется в качестве длинны типа данных.
Тогда мне ясно как работают указатели на типы данных.
Составить ответ | Вернуться на конференцию
Ответы
- Как был ты долбоебом, так им и останешься. Книжки читай, чудо в перьях. - пароль_потерял_ (08.05.2010, 19:43:31 194.190.183.238, пустое)
- Нет, тебе не ясно. Почитай книги, это наилучший вариант. Покомпилируй, посмотри листинги.. - Тумблер (08.05.2010, 18:34:45 62.176.15.52, пустое)
- Я под плисины пишу, и я знаю как компилятор (synplify) в кристал положит. Не, я понимаю стандарты... Более того, я всё пишу, особенно неоднозначные места (fsm) так, что их одинаково сожрёт и менторорвский, и хилинховский синтезатор. Я верилог знаю так, что неясно кто кого по стандартам и синтаксическим вывертам - я или разрабы синплифая. Но я здесь в былые времена просто пиздил о жизни и молча учился. - druzhin (08.05.2010, 12:10:2 89.178.149.158, пустое)
- Всем спасибо. Почитаю еще Ритчи и эти посты, кажись начинает проясняться. - Двоешник (08.05.2010, 11:16:39 193.200.150.137, пустое)
- Не знаю как у вас в Меге (это универмаг на Белой даче?), а у нас в пиках можно посмотреть во что каждая Сишная команда преобразуется. Прямо без затей- Сишная строка под ней ассемблерные. - Крок (08.05.2010, 11:04:53 62.118.59.14, пустое)
- Программа указателями никак не управляет.;) - Vit (08.05.2010, 10:29:39 77.123.106.1, 2405 байт)
- чоб не мучить народ (если это не главная задача)) - када чонить учишь, покупаешь 2-4 книги по теме, лучше переводные,.. Взгляд с 2-4 точек дает обычно достаточно полное представление. А уж книг щаз купить - пошел-выбрал-купил, а не открытку за 1.5 года отнёс.... - basilmak (08.05.2010, 10:26:36 89.191.241.237, пустое)
- Попробую ответить, думаю, товарищи дополнят а где и исправят.Могу только не примерах. Вот ты написал программу.>> - VasilyS (08.05.2010, 09:51:4 80.92.96.25, 844 байт)
- Не понимаю что ты не понимаешь. Размер типа данных - это константа, которая подставляется по месту непосредственно в каждое место, где используется тип. - Oldring (08.05.2010, 09:43:0 85.141.195.177, пустое)
- Есть два массива а и b: один соответственно типа char, другой типа int. Откеда программа в ПРОЦЕ знает как получать следующий (ну или там какой то по счету/индексу) элемент? Вот сам его адрес в памяти, как вычисляется? Ведь в массивах a и b, двадцать второй по счету элемент, находится на разных расстояниях от "начала". - Двоешник (08.05.2010, 10:08:25 193.200.150.137, пустое)
- По типу указателя. Компилятор узнает что задумал программист и подставляет в программу нужную константу. - Oldring (08.05.2010, 10:34:22 85.141.195.177, пустое)
- при компиляции по типу массива компилятор узнает, сколько надо прибавлять к указателю для "попадания" на нужный элемент и сразу генерирует ассемблерный код, делающий это правильно. никаких вычислений размера не делается run-time. - A_R_V (08.05.2010, 10:10:52 90.139.243.131,80.239.242.46, пустое)
- нифига. сама программа в конкретном железе должна уметь работать с адресной арифметикой применительно к конкретным типам, - Двоешник (08.05.2010, 10:17:53 193.200.150.137, 365 байт)
- Размер типа в runtime в Си не вычисляется. Только при компиляции - Vit (08.05.2010, 10:41:2 77.123.106.1, пустое)
- Вы писали: "Для обращения по указателю компилятор опять же либо выполняет вычисление смещения на этапе компиляции(подставляет вычисленную константу), либо организовывает вычисление смещения при выполнении программы (в runtime)" Так все же имеет место расчет длины в runtime? Это не принципиально и не особо важно, скорее просто любопытно:) - Двоешник (08.05.2010, 11:21:21 193.200.150.137, пустое)
- Ответ: - Vit (08.05.2010, 11:31:0 77.123.106.1, 196 байт)
- Смещение может рассчитываться в рантайме, но размеры типов рассчитываются только на этапе копиляции. - Vit (08.05.2010, 11:23:32 77.123.106.1, пустое)
- Вот еще насчет смещений. Компилятору, чтобы положить Х.., тьфу, "величину Х", в Мassiv[10] - не надо вычислять смещение (Massiv+10), т.к. начальный адрес &Massiv[0] постоянный и никуда не убежит. Компилятор "в уме" посчитает сумму начального адреса и смещение до 5-го элемента (в единицах хранения массива), и сразу типа MOV ADDR, X. А для доступа по Указателю компилятор бессилен предположить что сейчас содержит указатель, поэтому сгенерирует в асм-коде "честное" вычисление адреса [10], и МК будет корячиться тратить время и код под вычисления. - VasilyS (08.05.2010, 12:57:31 80.92.96.25, пустое)
- Ответ: в самом ИАРЕ у меня не получается ничего рассмотреть, во первых много всего асемблтца по умолчанию и на абсолютно еще пустом main {}, а во вторых на объявления переменных/указателей отладчик вообще не останавливается. Что там за этим всем стоит - не ясно. - Двоешник (08.05.2010, 02:30:29 193.200.150.137, пустое)