реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> скрипт + gcc
alx2
сообщение Jul 3 2009, 19:08
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(antiwin @ Jun 29 2009, 12:49) *
Привет всем, такой вот проблем: как можно узнать адрес в ОЗУ выше которого стек не "перерастет"? Это нужно сделать на этапе компиляции.
В общем случае это невозможно.
Цитата(antiwin @ Jun 29 2009, 12:49) *
И еще, можно ли в теле функции узнать тип возвращаемого значения т.е допустим определена функция void *foo(...), далее где то вызывается int *ptr=foo(...), как в теле foo узнать что это указатель на int?
Что "это"? smile.gif foo выполняется до присваивания, поэтому во время ее выполнения ptr еще не существует. Функция "знает" только то, что передается ей в качестве аргументов. Что потом произойдет с возвращаемым ей значением, она знать не может.
А позвольте полюбопытствовать, для чего нужно "знать" внутри функции, какому объекту будет потом присваиваться возвращаемое ей значение? Такое желание мне кажется довольно странным, и наводит на мысль, что на самом деле задача состоит в другом - обеспечении более строгой типизации. На C++ это решается множеством различных способов - например, вместо типа void* функция может возвращать экземпляр класса, содержащего методы преобразования указателя к нужному типу - но это никак не будет влиять на код функции. Или инстанцированием функции из шаблона - тут код функции будет сразу генериться с учетом нужного типа, но тип придется при каждом вызове указывать явно...

Сообщение отредактировал alx2 - Jul 3 2009, 19:10


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
Troll
сообщение Jul 8 2009, 05:48
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 104
Регистрация: 30-06-05
Из: С-Петербург
Пользователь №: 6 406



Цитата(antiwin @ Jun 29 2009, 13:49) *
И еще, можно ли в теле функции узнать тип возвращаемого значения т.е допустим определена функция void *foo(...), далее где то вызывается int *ptr=foo(...), как в теле foo узнать что это указатель на int?

А для чего это надо?
И если уж работаете с указателями, то почему бы просто не выполнить явное преобразование типа
Код
int *ptr = (int*) foo();


--------------------
Hemos Pasado
Go to the top of the page
 
+Quote Post
antiwin
сообщение Jul 14 2009, 11:08
Сообщение #18


Участник
*

Группа: Новичок
Сообщений: 22
Регистрация: 20-05-09
Пользователь №: 49 303



Цитата(alx2 @ Jul 3 2009, 23:08) *
В общем случае это невозможно.

Да в общем случае ненадо, можно ли найти данные(в файлах lst, map...) или где еще позволяющие расчитать вершину стека.?

Цитата(alx2 @ Jul 3 2009, 23:08) *
А позвольте полюбопытствовать, для чего нужно "знать" внутри функции, какому объекту будет потом присваиваться возвращаемое ей значение?


Вобщем все просто, хочется написать альтернативу malloc ибо представляется она мне очень "глупой", ну не видит она где heap, а где stack. Кроме простого выделения памяти хочеться организовать минимальный менеджер памяти, способный дефрагментировать память. Конечно, об универсальном проекте речь не идет, но хотябы для "mega" с ОЗУ>500 байт. smile.gif

Цитата(Troll @ Jul 8 2009, 09:48) *
А для чего это надо?
И если уж работаете с указателями, то почему бы просто не выполнить явное преобразование типа
Код
int *ptr = (int*) foo();


В том и проблема, так как можно char* foo(), и int* foo(), и uin32_t* foo(), т.е заранее неизвестно какой тип указателя нужен.

Сообщение отредактировал antiwin - Jul 14 2009, 11:00
Go to the top of the page
 
+Quote Post
msalov
сообщение Jul 14 2009, 11:30
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



 
Цитата(antiwin @ Jul 14 2009, 14:08) *
В том и проблема, так как можно char* foo(), и int* foo(), и uin32_t* foo(), т.е заранее неизвестно какой тип указателя нужен.


Так делайте явное преобразование типа по месту, как это сделано в malloc

Код
void * my_malloc(size_t length);

char *a = (char*)my_malloc(2);

int *b = (int*)my_malloc(2);

long *c = (long*)my_malloc(2);
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 14 2009, 11:41
Сообщение #20


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(antiwin @ Jul 14 2009, 14:08) *
менеджер памяти, способный дефрагментировать память.
Интересно, как вы собираетесь это реализовать? Выделил ваш менеджер участок с адреса, скажем, 110. Вернул указатель. Вы его запомнили. Потом он в процессе дефрагментации переместил этот участок на адрес, скажем, 100. Как он сообщит вашей программе, что старый указатель больше не действителен? А если вы его уже успели скопировать в три других указателя?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 14 2009, 13:05
Сообщение #21


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



smile.gif Наверное речь идёт о дефрагментации свободных участков. По крайней мере, я не слышал о менеджерах памяти, дефрагментирующих выделенные блоки.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
msalov
сообщение Jul 15 2009, 06:22
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(AHTOXA @ Jul 14 2009, 16:05) *
smile.gif Наверное речь идёт о дефрагментации свободных участков. По крайней мере, я не слышал о менеджерах памяти, дефрагментирующих выделенные блоки.

Ну, если память состоит только их занятых и свободных блоков, то дефрагментация одних эквивалентна дефрагментации других. Или там ещё бывают участки в "третьем" состоянии? Просветите, я не в курсе sad.gif
Go to the top of the page
 
+Quote Post
Troll
сообщение Jul 15 2009, 10:28
Сообщение #23


Частый гость
**

Группа: Участник
Сообщений: 104
Регистрация: 30-06-05
Из: С-Петербург
Пользователь №: 6 406



Цитата(gotty @ Jul 15 2009, 13:22) *
Ну, если память состоит только их занятых и свободных блоков, то дефрагментация одних эквивалентна дефрагментации других.
НЕТ. maniac.gif
Для хранения всех локальных переменных (переменных объявленных внутри функций) используется стек. Для дефрагментации занятых блоков все указатели (абсолютно все) должны быть видны вашему менеджеру памяти. См. пост №20.

Дефрагментация свободных блоков - это уже другая задача. На свободные участки указатели уже не хранят значения, а если такое и случается это уже ошибка программиста.
Менеджер памяти хранит списки свободных и занятых блоков и после некоторого количества операций по выделению/освобождению памяти получается, что два и более последовательных блока свободны и их можно объединить в один большой свободный блок. Это и есть дефрагментация свободной памяти.

Цитата
ну не видит она где heap, а где stack
Размер стека определяется программистом и известен на этапе компиляции программы. Почему бы не написать функцию для проверки свободного места, которая будет знать размер стека? и выполняйте ее перед каждым вызовом malloc.


--------------------
Hemos Pasado
Go to the top of the page
 
+Quote Post
antiwin
сообщение Jul 16 2009, 08:42
Сообщение #24


Участник
*

Группа: Новичок
Сообщений: 22
Регистрация: 20-05-09
Пользователь №: 49 303



Цитата(Сергей Борщ @ Jul 14 2009, 15:41) *
Интересно, как вы собираетесь это реализовать?

Просто, в ячейку указателя записывается новый адрес и все. Адрес самого указателя то не меняется.
Что бы видеть все указатели, в менеджере предусмотрена специальная структура в которой каждому указателю(его адресу) соответствует адрес блока данных. Эта вынужденая мера, так как при работе с указателем его значение меняется, а в этой структуре он постоянен. Когда же приходит время удалить блок начало этого бока берется в структуре.


Цитата(Сергей Борщ @ Jul 14 2009, 15:41) *
А если вы его уже успели скопировать в три других указателя?

Ну тут ничего не сделаешь, как и в любом компиляторе рано или поздно приходиться самому контролировать.
К тому же не вижу практического смысла таких действий, потенциальный источник ошибок.

Цитата(gotty @ Jul 14 2009, 15:30) *
Так делайте явное преобразование типа по месту, как это сделано в malloc

К стати, пытался найти описание malloc и других встроенных функций, но кроме определения не нашел.
Где же они все таки описанны.?

Сообщение отредактировал antiwin - Jul 16 2009, 09:00
Go to the top of the page
 
+Quote Post
aesok
сообщение Jul 16 2009, 09:34
Сообщение #25


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(antiwin @ Jul 16 2009, 12:42) *
Просто, в ячейку указателя записывается новый адрес и все. Адрес самого указателя то не меняется.
Что бы видеть все указатели, в менеджере предусмотрена специальная структура в которой каждому указателю(его адресу) соответствует адрес блока данных.


А какой размер этого масива? Три? Десять? Сто? А.... Вы озадачите нас вопросом: Как во время компиляции узнать количество используемых указателей в работуещей программе?!

Цитата(antiwin @ Jul 16 2009, 12:42) *
Ну тут ничего не сделаешь, как и в любом компиляторе рано или поздно приходиться самому контролировать.
К тому же не вижу практического смысла таких действий, потенциальный источник ошибок.

Вы никогда не слашали про такую вещь как Двусвязный список?

Цитата(antiwin @ Jul 16 2009, 12:42) *
К стати, пытался найти описание malloc и других встроенных функций, но кроме определения не нашел.
Где же они все таки описанны.?


Не сочтите за рекламу: www.google.com

Анатолий.

Сообщение отредактировал aesok - Jul 16 2009, 10:07
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 16 2009, 09:54
Сообщение #26


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(antiwin @ Jul 16 2009, 11:42) *
К тому же не вижу практического смысла таких действий, потенциальный источник ошибок.
Простите, а как же тогда передавать этот массив в функции? Параметр функции передается по значению, т.е. создается временная переменная, в которую копируется значение параметра, в нашем случае - указателя. Да и просто ходить по массиву удобнее двигая указатель, а не индексируясь каждый раз отностительно указателя на начало. Опять же, компилятор имеет право втайне от вас завести временный указатель для таких целей.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
antiwin
сообщение Jul 16 2009, 11:58
Сообщение #27


Участник
*

Группа: Новичок
Сообщений: 22
Регистрация: 20-05-09
Пользователь №: 49 303



Цитата(aesok @ Jul 16 2009, 13:34) *
А какой размер этого масива? Три? Десять? Сто? А.... Вы озадачите нас вопросом:

Кол-во указателей (размер массива) определяется на этапе компиляции, путем подсчета вызовов определенной функции, отвечающей за выделение памяти.

Цитата(Сергей Борщ @ Jul 16 2009, 13:54) *
Простите, а как же тогда передавать этот массив в функции?

А почему бы это не делать в функции? Ведь так гораздо проще контролировать для чего выделяется память.
Но даже если придется, то просто в дело вступает еще один указатель указываеющий на "исходный" а тот-на массив (его начало).
Поправте, если ошибаюсь.

Цитата(aesok @ Jul 16 2009, 13:34) *
Не сочтите за рекламу: www.google.com

Гуглился битый час, может не тот гугль, но так или иначе отсылает к avr-libc. А там ничего.
Дайте нужную ссылку пожалуйста.

Сообщение отредактировал antiwin - Jul 16 2009, 11:45
Go to the top of the page
 
+Quote Post
aesok
сообщение Jul 16 2009, 13:19
Сообщение #28


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(antiwin @ Jul 16 2009, 15:58) *
Кол-во указателей (размер массива) определяется на этапе компиляции, путем подсчета вызовов определенной функции, отвечающей за выделение памяти.


объясните мне: как во время компиляции можно узнать сколько раз будет вызвана функция во время работы программы?

Цитата(antiwin @ Jul 16 2009, 15:58) *
Гуглился битый час, может не тот гугль, но так или иначе отсылает к avr-libc. А там ничего.
Дайте нужную ссылку пожалуйста.


http://ru.wikipedia.org/wiki/Malloc
http://www.nongnu.org/avr-libc/user-manual...678e5251dfd3ebd
http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1124.pdf - начиная со стриницы 313

Анатолий.
Go to the top of the page
 
+Quote Post
antiwin
сообщение Jul 17 2009, 09:05
Сообщение #29


Участник
*

Группа: Новичок
Сообщений: 22
Регистрация: 20-05-09
Пользователь №: 49 303



Цитата(aesok @ Jul 16 2009, 17:19) *
объясните мне:

Не во время компиляции, а как бы перед ней, т.е скриптом (или иначе) анализируется каждый файл (*.с) проекта
где и подсчитывается сколько раз вызывается функция. Потом это число записывается в файл и далее идет сама компиляция. Просто весь процесс я обозвал компиляцией.



Цитата(aesok @ Jul 16 2009, 17:19) *

Под описанием я имел ввиду не описание в человеческом смысле, а в рамках С99, т.е тело функции. А в предложенных ссылках (за них спасибо) описанние именно в первом смысле.


Цитата(Troll @ Jul 15 2009, 14:28) *
Размер стека определяется программистом...

Смысл задуманного как раз в том чтобы освободить программиста от такого "счастья".
Go to the top of the page
 
+Quote Post
smac
сообщение Jul 17 2009, 10:19
Сообщение #30


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(antiwin @ Jul 17 2009, 13:05) *
Не во время компиляции, а как бы перед ней, т.е скриптом (или иначе) анализируется каждый файл (*.с) проекта
где и подсчитывается сколько раз вызывается функция. Потом это число записывается в файл и далее идет сама компиляция. Просто весь процесс я обозвал компиляцией.

Если ф-я вызывается в цикле, то Ваш анализ будет условия циклов проверять и т. д.? Если условие цикла зависит от железа (перефирийных блоков)? Эмулировать все будете?
У меня конечно нет точных сведений, но по-моему, такого хорошего эмулятора (кроме реального железа конечно) не существует.
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01506 секунд с 7
ELECTRONIX ©2004-2016