Разработка, производство и продажа радиоэлектронной аппаратуры
|
Карта сайта
|
Пишите нам
|
В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:
jobsmp@pochta.ru
Телесистемы
|
Электроника
|
Конференция «Микроконтроллеры и их применение»
Не понимаю что ты не понимаешь. Размер типа данных - это константа, которая подставляется по месту непосредственно в каждое место, где используется тип.
Отправлено
Oldring
(85.141.195.177)
08 мая 2010, г. 09:43
В ответ на:
VasilyS, вот обсуждали мы с тобой указатели, и ты все время ссылаешься на компилятор,
отправлено
Двоешник
08 мая 2010, г. 02:27
Составить ответ
|
Вернуться на конференцию
Ответы
Есть два массива а и 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
,
пустое
)
Всё проще. Компилятор если имеет возможность посчитать использовать константу, то использует (не только для смещений). В других случаях перенесёт расчёт в рантайм.
-
Vit
(08.05.2010, 13:11:58
77.123.100.54
, 117 байт)
Кстати, вот забыл спросить об указателе на функции. Есть ведь некоторая разница между последовательно расположенным массивом данных и программой ,которая что угодно моет делать. Как с указателями на функции ,то же несколько байт в которых адрес начала?
-
Двоешник
(08.05.2010, 18:38:14
193.200.150.125
,
пустое
)
Да, просто адреса начала функций. Все возвращаемые значения и входные аргументы - это только для компилятора, чтобы он распихал их перед вызовом функции в нужные регистры, и знал что делать с возвращаемыми данными. А сами указатели на функции (например, это хорошо видно когда они оформлены в виде массива) - они просто адреса, и в них нет доп. информации о вызываемой функции.
-
VasilyS
(08.05.2010, 19:10:45
80.92.96.25
,
пустое
)
Отправка ответа
Имя*:
Пароль:
E-mail:
Тема*:
Сообщение:
Ссылка на URL:
URL изображения:
если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 56:
Перейти к списку ответов
|
Конференция
|
Раздел "Электроника"
|
Главная страница
|
Карта сайта
Web
telesys.ru