|
Локальные переменные в Си, Оптимизация памяти |
|
|
|
Nov 19 2006, 19:53
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(SasaVitebsk @ Nov 19 2006, 21:37)  Например имеется переменные x,y,z и п/п A и В. П/п В вызывается из А и только из неё. Переменные используются только в этих двух процедурах и за пределами этих процедур в них нет необходимости. 1. В поставаленых условиях нет необходимости в "B", как подпрограмме. Для красоты можете написать макрос(ы). Переменные автоматически становятся локальными со всеми вытекающими положительными последствиями. 3.Как вариант, для реально большого количества переменных - используйте динамическое выделение памяти. 4.Как вариант - переменные в структуру в стеке "A" и "B" передается указатель на структуру.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 19 2006, 20:07
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 17-06-06
Пользователь №: 18 139

|
Цитата(SasaVitebsk @ Nov 19 2006, 23:37)  Доброго времени суток.
Стоит задача оптимизировать использование оперативной памяти. Такой вопрос. Например имеется переменные x,y,z и п/п A и В. П/п В вызывается из А и только из неё. Переменные используются только в этих двух процедурах и за пределами этих процедур в них нет необходимости. В файле имеются другие п/п.
Если переменные объявить следующем образом:
int x,y,z;
int B(void) { }
int A(void) { }
То будет ли освобождаться память из под переменных после выхода из A.
Или каков аналог в Си конструкции Pascal
procedure A; var x,y,z : integer;
procedure B; begin end;
begin end; По-моему, такие глобальные переменные будут занимать память постоянно. Если уж нужно экономить память, то я бы в процедуру B передавал бы ссылку на объявленные в процедуре А переменные. int B(int *Px, int *Py, int *Pz) { } int A(void) { int x,y,z; int *Px = &x, int *Py = &y, int *Pz = &z; .... int i = B(Px,Py,Pz); }
|
|
|
|
|
Nov 19 2006, 21:20
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(zorromen @ Nov 19 2006, 22:57)  неправильно. ??? 1. Неплохо русский язык подтянуть. 2. C "C" тоже проблемы :-( - из избыточного текста просто еще более избыточный изобразили без какой либо на то надобности. Учитесь лаконично мысль выражать без нагромождения лишних переменных: Код int A(void) { int x,y,z; ....... B( &x, &y, &z ); } А если экономить собрались, то я кажется уже сказал, в том числе и по поводу предлагаемого: Цитата 4.Как вариант - переменные в структуру в стеке "A" и "B" передается указатель на структуру. Ибо стек тоже не резиновый и зачастую указатели поболе переменных имеют место быть....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 19 2006, 22:33
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(zorromen @ Nov 19 2006, 23:52)  Да ...может и громоздко.и не отимально...но ведь это верно... И у того, кому Вы указали "неправильно" было верно и менее запутанно. И пару 'int' ОШИБОЧНО лишних найдите. Цитата Я ваще магу и на украинском) Тогда жаргонизмов поменьше и будет вполне читабельно.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 19 2006, 23:08
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 17-06-06
Пользователь №: 18 139

|
Цитата(zorromen @ Nov 20 2006, 01:52)  Я ваще магу и на украинском)
2. C "C" тоже проблемы я что неправельно написал? int *Px , int *Py, int *Pz; Px = &x;Py = &y;Pz = &z;
Да ...может и громоздко.и не отимально...но ведь это верно...java script:emoticon(':glare:', 'smid_13') Пардон, действительно ошибся. Нужно было: int *Px = &x; int *Py = &y; int *Pz = &z; (Вместо запятых - точки с запятой)
|
|
|
|
|
Nov 20 2006, 00:14
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(zorromen @ Nov 20 2006, 04:46)  Извеняйте но как вы указателю *Px = даете адресс (&x) Бо надо Px=&x тада *Px дает значение переменной Х
*Px = &x пардон чему равно Px==? Извините, что вмешиваюсь, но в чем вы видите проблему? Почему объявление указателя с одновременной его инициализацией у вас вызывает такое неприятие? Ведь с точки зрения синтаксиса языка Си Код int *pX=&X; это то же самое что Код int *pX; pX=&X; а отнюдь не Код *pX=&X; как вы пытаетесь намекать. И даже не Код pX=X;
|
|
|
|
|
Nov 20 2006, 00:39
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(SasaVitebsk @ Nov 19 2006, 21:37)  Или каков аналог в Си конструкции Pascal
procedure A; var x,y,z : integer;
procedure B; begin end;
begin end; На первую часть уже ответили - постарайтесь либо запихнуть B() в макросы, либо всё нужное внутри A() упихать в структуру и передавать указатель на неё. Кстати, если B() при этом будет static, то умный компилятор может сам её проинлайнить с оптимизацией обращений и "основное" тело выбросить. Если компилятор С (не С++, где это и так есть) поддерживает стандарт C99, то тогда вообще можно static inline B(a_vars_struct *p) и он будет обязан проинлайнить. А вот аналога вложенных функций паскаля в стандартном С нет - есть только в расширениях GCC. Код void A() { int x, y, z; static inline void B(void) { x = y + z; } // ... B(); // ... } Вложенную функцию очень желательно объявлять static inline - иначе для неё генерируется отдельное тело с раскруткой указателя на стековый фрейм охватывающей функции и всё становится большим и тормозным. Но если предполагается передача указателя на вложенную функцию куда-то дальше, то тогда от static придётся отказаться (inline можно оставить - тогда "местные" вызовы проинлайнятся, но и отдельное тело будет для "удалённых" вызовов). Навскидочно-тупой пример (именно тут проще "традиционно"): Код int * C(int *p, int len, uint8_t (*pf)(int i) ) { while(len--) { if( pf(*p) == 0 ) return p; ++p; } return 0; }
void A(ну какие-то аргументы) { int min, max, len; int *ptr; int *pbuf; uint8_t B(int i) { retrun ( i >= min && i <= max); } // ... ptr = C( pbuf, len, B); // ... }
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Nov 20 2006, 17:47
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(SasaVitebsk @ Nov 20 2006, 16:37)  В описании компилятора очень скупо и, честно говоря, непонятно. Конечная инстанция и конкретная реализация именно в описании компилятора. Читайте, осмысливайте. Пробуйте делать лабораторные работы. Поробуйте задавать конкретные вопросы. Или предполагаете, что кто-то в форуме от нечего делать напишет дивную обьясниловку превосходящую по обьему и доходчивости творение авторов компилятора?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 20 2006, 17:53
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(SasaVitebsk @ Nov 20 2006, 16:37)  Всем ответившим спасибо. Скажите, а где более полно прочитать можно про Inline и тому подобные штучки. В книге по Си я не нашёл. В описании компилятора очень скупо и, честно говоря, непонятно. В многочисленных постах достаточно разноречивая информация. Использую IAR. 1) Стандарт С99 - искать в интернете файл iso9899-c99.pdf, стандарт C++ ISO14882 Длинно, иногда скучно, но это "как должно быть". 2) Как уже было сказано, описание на используемый компилятор - части "совместимость со стандартом" и "расширения языка".
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Nov 20 2006, 23:05
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(zorromen @ Nov 20 2006, 21:03)  Ну зачем с минимальными навыками в программировании...на асме всеравно удобно некоторые фишки производить... Какие? (не подумайте что я против ассемблера как такового), просто не люблю перемешивать котлеты с мухами. Писать на ассемблере целесообразно только для получения оптимального кода отлаженного алгоритма. При этом недостатками будет: 1. Полная непереносимость кода на другие платформы. 2. Много времени на разработку. 3. Сложность модификации. (править тяжело). В остальных случаях целесообразно применять Cи, и чем "чище" будет Си - тем легче такой код потом будет прочитать, тем проще осуществить перенос кода на другие платформы. Вставлять же ассемблерные вставки, внутрь Си-шных функций ради каких-то "фишек" лишает всех преимуществ Си-шного проекта, делает код трудно читаемым и нарушает переносимость не только в случае различных платформ, но в рамках одной платформы, т.к. у разных компиляторов (даже одного и того же производителя) могут быть разные соглашения о передаче параметров.
|
|
|
|
|
Nov 20 2006, 23:21
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(zorromen @ Nov 20 2006, 23:15)  но я уже 5 лет програмю на паскале и делфи..а тама указателями и не пахло... Да ну? за 5 лет так и не поняли, что со всеми классами вы работаете именно через указатели? Строки (String), исключения (Exceptions) - и те указатели и т.п. Цитата А фишки...это всякие тam сдвиги. Мне всегда казалось, что проще и понятнее будет написать: (x<< 3) чем: lsl xl rol xh lsl xl rol xh lsl xl rol xh
|
|
|
|
|
Nov 22 2006, 16:20
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(zorromen @ Nov 21 2006, 19:14)  я радиофизик, а не программист и програмил тока если нада чета посчитать....а вникать особо смысла не имело...А щас сам решил...шо пара учить микроконтроллеры..авр понравились...так что не нада меня ругать... а че я пристал с асм..та просто диплом пишу и если все будет на Сях то шото маловато тексту...а если на асме вставки то вроде даже пару листов можна накинуть...для приличию) преподы просто кроме 51 и асма для него ничего не знають... Ну, так странслируйте и сгенерированный код поместите в записку. Будет и много, и в меру непонятно.
|
|
|
|
Guest_Serg79_*
|
Nov 23 2006, 15:32
|
Guests

|
Цитата(zorromen @ Nov 21 2006, 19:14)  я радиофизик, а не программист и програмил тока если нада чета посчитать....а вникать особо смысла не имело...А щас сам решил...шо пара учить микроконтроллеры..авр понравились...так что не нада меня ругать... а че я пристал с асм..та просто диплом пишу и если все будет на Сях то шото маловато тексту...а если на асме вставки то вроде даже пару листов можна накинуть...для приличию) преподы просто кроме 51 и асма для него ничего не знають...  Если ты на 'C' толком написать не можешь, то ты думаешь что у тебя на 'asm' что-то толковое получиться. Смотри, наваратишь черт знает чего на 'asm', а тебе препод толковый попадеться который шарит в этом. Так он тебя с твоим дипломом на х.. пошлет и на повтор оставит. И будешь ты потом на Делфи в трубу дудеть
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|