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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Локальные переменные в Си, Оптимизация памяти
SasaVitebsk
сообщение Nov 19 2006, 19:37
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Доброго времени суток.

Стоит задача оптимизировать использование оперативной памяти.
Такой вопрос. Например имеется переменные 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;
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 19 2006, 19:53
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
zorromen
сообщение Nov 19 2006, 19:59
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 13-12-05
Пользователь №: 12 147



Если переменные объявить следующем образом:

int x,y,z;

int B(void)
{
}

int A(void)
{
}

То как я понял.что здеся.. x,y,z это глобальные переменные. и компилятором даются адреса в регистрах
с р4 до р20 в CV. а потом в озу после стека данных. и нету тут никакой оптимизации в памяти.

если написать

int B(void)
{
int x,y,z;
}

int A(void)
{
int x,y,z;
}

то будет освобождение...т.к. это локальные переменные и кстати надо следить что тама будет то при вызове процедуры то тама будет мусор ...
это все статическое распределение...
вот есть еще динамическое...это HEAP...тама и выделение и освобождение памяти...
Go to the top of the page
 
+Quote Post
Stefan
сообщение Nov 19 2006, 20:07
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 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);
}
Go to the top of the page
 
+Quote Post
zorromen
сообщение Nov 19 2006, 20:57
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 13-12-05
Пользователь №: 12 147



неправильно.
int *Px = &x, int *Py = &y, int *Pz = &z;
правильно так

int *Px , int *Py, int *Pz;
Px = &x;Py = &y;Pz = &z;

Указатели [размерность]
*X= [Значение]
X= [Адресс]
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 19 2006, 21:20
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
zorromen
сообщение Nov 19 2006, 21:52
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 13-12-05
Пользователь №: 12 147



Я ваще магу и на украинском)

2. C "C" тоже проблемы
я что неправельно написал?
int *Px , int *Py, int *Pz;
Px = &x;Py = &y;Pz = &z;

Да ...может и громоздко.и не отимально...но ведь это верно...java script:emoticon(':glare:', 'smid_13')
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 19 2006, 22:33
Сообщение #8


Гуру
******

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



Цитата(zorromen @ Nov 19 2006, 23:52) *
Да ...может и громоздко.и не отимально...но ведь это верно...

И у того, кому Вы указали "неправильно" было верно и менее запутанно.
И пару 'int' ОШИБОЧНО лишних найдите.
Цитата
Я ваще магу и на украинском)

Тогда жаргонизмов поменьше и будет вполне читабельно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Stefan
сообщение Nov 19 2006, 23:08
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 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;

(Вместо запятых - точки с запятой)
Go to the top of the page
 
+Quote Post
zorromen
сообщение Nov 19 2006, 23:46
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 13-12-05
Пользователь №: 12 147



Извеняйте но как вы указателю *Px = даете адресс (&x)
Бо надо Px=&x
тада *Px дает значение переменной Х

*Px = &x пардон чему равно Px==?
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 20 2006, 00:14
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 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;
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 20 2006, 00:39
Сообщение #12


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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);
    // ...
}


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 20 2006, 02:00
Сообщение #13


кекс
******

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



Цитата(Stefan @ Nov 20 2006, 02:08) *
Пардон, действительно ошибся. Нужно было:

int *Px = &x; int *Py = &y; int *Pz = &z;
(Вместо запятых - точки с запятой)

Или как zltigo говорит - просто убрать два лишних int и оставить запятые..
Go to the top of the page
 
+Quote Post
zorromen
сообщение Nov 20 2006, 08:55
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 13-12-05
Пользователь №: 12 147



Нувот в споре и радилась истина)))
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 20 2006, 09:27
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(zorromen @ Nov 20 2006, 08:55) *
Нувот в споре и радилась истина)))


Чего рожать то? Компилятору нужно доверять - он все и заоптимизирует.
Иногда насмерть laugh.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Nov 20 2006, 17:37
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Всем ответившим спасибо. Скажите, а где более полно прочитать можно про Inline и тому подобные штучки. В книге по Си я не нашёл. В описании компилятора очень скупо и, честно говоря, непонятно. В многочисленных постах достаточно разноречивая информация. Использую IAR.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 20 2006, 17:47
Сообщение #17


Гуру
******

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



Цитата(SasaVitebsk @ Nov 20 2006, 16:37) *
В описании компилятора очень скупо и, честно говоря, непонятно.

Конечная инстанция и конкретная реализация именно в описании компилятора. Читайте, осмысливайте.
Пробуйте делать лабораторные работы. Поробуйте задавать конкретные вопросы. Или предполагаете, что кто-то в форуме от нечего делать напишет дивную обьясниловку превосходящую по обьему и доходчивости творение авторов компилятора?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 20 2006, 17:53
Сообщение #18


Нечётный пользователь.
******

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



Цитата(SasaVitebsk @ Nov 20 2006, 16:37) *
Всем ответившим спасибо. Скажите, а где более полно прочитать можно про Inline и тому подобные штучки. В книге по Си я не нашёл. В описании компилятора очень скупо и, честно говоря, непонятно. В многочисленных постах достаточно разноречивая информация. Использую IAR.

1) Стандарт С99 - искать в интернете файл iso9899-c99.pdf, стандарт C++ ISO14882
Длинно, иногда скучно, но это "как должно быть".
2) Как уже было сказано, описание на используемый компилятор - части "совместимость со стандартом" и "расширения языка".


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
zorromen
сообщение Nov 20 2006, 19:12
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 13-12-05
Пользователь №: 12 147



Вапрос. Как обратиться к локальным переменным...когда используешь ассемблерные вставки
void B(int *Px, int *Px ) эта часть панятна типа в стеке данных
{
int temp=23;
temp++;
#asm

Так вот как обратиться к temp
например чтобы с ней уже тута работать
иногда в асме красиво получается

#endasm
}

компилятор CV
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 20 2006, 19:59
Сообщение #20


Гуру
******

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



Цитата(zorromen @ Nov 20 2006, 18:12) *
иногда в асме красиво получается

Не делайте так. Тем более с минимальными навыками в программировании. Не стоит оно этого практически никогда. Пишите или всю функцию на ASM или не пишите вообще.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
zorromen
сообщение Nov 20 2006, 21:03
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 13-12-05
Пользователь №: 12 147



Ну зачем с минимальными навыками в программировании...на асме всеравно удобно некоторые фишки производить...может всеже можна какнить обратиться к локальным...или лучше так тада...?

int с (int *c)
{
#asm

возврат функции в 30 и 31 регистре
#endasm
}

void B(void)
{
int temp=23;
temp++;
temp=c(&temp);
}
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 20 2006, 23:05
Сообщение #22


кекс
******

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



Цитата(zorromen @ Nov 20 2006, 21:03) *
Ну зачем с минимальными навыками в программировании...на асме всеравно удобно некоторые фишки производить...

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

Писать на ассемблере целесообразно только для получения оптимального кода отлаженного алгоритма. При этом недостатками будет:
1. Полная непереносимость кода на другие платформы.
2. Много времени на разработку.
3. Сложность модификации. (править тяжело).

В остальных случаях целесообразно применять Cи, и чем "чище" будет Си - тем легче такой код потом будет прочитать, тем проще осуществить перенос кода на другие платформы.
Вставлять же ассемблерные вставки, внутрь Си-шных функций ради каких-то "фишек" лишает всех преимуществ Си-шного проекта, делает код трудно читаемым и нарушает переносимость не только в случае различных платформ, но в рамках одной платформы, т.к. у разных компиляторов (даже одного и того же производителя) могут быть разные соглашения о передаче параметров.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 20 2006, 23:10
Сообщение #23


Гуру
******

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



Цитата(zorromen @ Nov 20 2006, 20:03) *
...или лучше так тада...?

Вопрос про "вставки" на моей памяти поднимался на форуме. Я там уже объяснялся - больше не хочется.
Можете либо поискать, либо принять как заповедь :-))))


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
zorromen
сообщение Nov 20 2006, 23:15
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 13-12-05
Пользователь №: 12 147



Што какие, навыки или фишки? на счен навыков....я конечно не программист и С относительно недавно использую..но я уже 5 лет програмю на паскале и делфи..а тама указателями и не пахло...
А фишки...это всякие тam сдвиги.обмен полубайтами и всякими такими арифметическими штуками... java script:emoticon(':ninja:', 'smid_19')
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 20 2006, 23:21
Сообщение #25


кекс
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
zorromen
сообщение Nov 21 2006, 19:14
Сообщение #26


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 13-12-05
Пользователь №: 12 147



я радиофизик, а не программист и програмил тока если нада чета посчитать....а вникать особо смысла не имело...А щас сам решил...шо пара учить микроконтроллеры..авр понравились...так что не нада меня ругать...
а че я пристал с асм..та просто диплом пишу и если все будет на Сях то шото маловато тексту...а если на асме вставки то вроде даже пару листов можна накинуть...для приличию) преподы просто кроме 51 и асма для него ничего не знають...

Сообщение отредактировал zorromen - Nov 21 2006, 19:28
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 21 2006, 20:24
Сообщение #27


кекс
******

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



Цитата(zorromen @ Nov 21 2006, 19:14) *
а че я пристал с асм..та просто диплом пишу и если все будет на Сях то шото маловато тексту...а если на асме вставки то вроде даже пару листов можна накинуть...для приличию) преподы просто кроме 51 и асма для него ничего не знають...

Дык писали бы скока получается.. Мало - хорошо. "Краткость - сестра таланта".
Вставляют в дипломы всякую лабуду на асме тогда, когда нахалтурено там.

Да и программа обычно не относится к тексту диплома, а является приложением.
Go to the top of the page
 
+Quote Post
zorromen
сообщение Nov 21 2006, 21:24
Сообщение #28


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 13-12-05
Пользователь №: 12 147



да...хотя если работает то и ладно...кто там будет разбираться как она работает...гланое чтобы работала...кароче с пивом пойдет.....
Go to the top of the page
 
+Quote Post
_Bill
сообщение Nov 22 2006, 16:20
Сообщение #29


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



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

Ну, так странслируйте и сгенерированный код поместите в записку. Будет и много, и в меру непонятно.
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение Nov 23 2006, 15:32
Сообщение #30





Guests






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

smile.gif Если ты на 'C' толком написать не можешь, то ты думаешь что у тебя на 'asm' что-то толковое получиться.

Смотри, наваратишь черт знает чего на 'asm', а тебе препод толковый попадеться который шарит в этом. Так он тебя с твоим дипломом на х.. пошлет и на повтор оставит.

И будешь ты потом на Делфи в трубу дудеть 1111493779.gif
Go to the top of the page
 
+Quote Post
zorromen
сообщение Nov 23 2006, 21:51
Сообщение #31


Местный
***

Группа: Свой
Сообщений: 322
Регистрация: 13-12-05
Пользователь №: 12 147



На Сях уже и так все написано...А преподу и так всеравно...
Go to the top of the page
 
+Quote Post

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

 


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


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