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

 
 
> Локальные переменные в Си, Оптимизация памяти
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
 
Start new topic
Ответов
ReAl
сообщение Nov 20 2006, 00:39
Сообщение #2


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

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

Сообщений в этой теме
- SasaVitebsk   Локальные переменные в Си   Nov 19 2006, 19:37
- - zltigo   Цитата(SasaVitebsk @ Nov 19 2006, 21:37) ...   Nov 19 2006, 19:53
- - zorromen   Если переменные объявить следующем образом: int x...   Nov 19 2006, 19:59
- - Stefan   Цитата(SasaVitebsk @ Nov 19 2006, 23:37) ...   Nov 19 2006, 20:07
- - zorromen   неправильно. int *Px = &x, int *Py = &y, i...   Nov 19 2006, 20:57
|- - zltigo   Цитата(zorromen @ Nov 19 2006, 22:57) неп...   Nov 19 2006, 21:20
- - zorromen   Я ваще магу и на украинском) 2. C "C" т...   Nov 19 2006, 21:52
|- - zltigo   Цитата(zorromen @ Nov 19 2006, 23:52) Да ...   Nov 19 2006, 22:33
|- - Stefan   Цитата(zorromen @ Nov 20 2006, 01:52) Я в...   Nov 19 2006, 23:08
|- - defunct   Цитата(Stefan @ Nov 20 2006, 02:08) Пардо...   Nov 20 2006, 02:00
- - zorromen   Извеняйте но как вы указателю *Px = даете адресс (...   Nov 19 2006, 23:46
|- - rezident   Цитата(zorromen @ Nov 20 2006, 04:46) Изв...   Nov 20 2006, 00:14
- - zorromen   Нувот в споре и радилась истина)))   Nov 20 2006, 08:55
|- - Dog Pawlowa   Цитата(zorromen @ Nov 20 2006, 08:55) Нув...   Nov 20 2006, 09:27
- - SasaVitebsk   Всем ответившим спасибо. Скажите, а где более полн...   Nov 20 2006, 17:37
|- - zltigo   Цитата(SasaVitebsk @ Nov 20 2006, 16:37) ...   Nov 20 2006, 17:47
|- - ReAl   Цитата(SasaVitebsk @ Nov 20 2006, 16:37) ...   Nov 20 2006, 17:53
- - zorromen   Вапрос. Как обратиться к локальным переменным...ко...   Nov 20 2006, 19:12
|- - zltigo   Цитата(zorromen @ Nov 20 2006, 18:12) ино...   Nov 20 2006, 19:59
- - zorromen   Ну зачем с минимальными навыками в программировани...   Nov 20 2006, 21:03
|- - defunct   Цитата(zorromen @ Nov 20 2006, 21:03) Ну ...   Nov 20 2006, 23:05
|- - zltigo   Цитата(zorromen @ Nov 20 2006, 20:03) ......   Nov 20 2006, 23:10
- - zorromen   Што какие, навыки или фишки? на счен навыков....я ...   Nov 20 2006, 23:15
|- - defunct   Цитата(zorromen @ Nov 20 2006, 23:15) но ...   Nov 20 2006, 23:21
- - zorromen   я радиофизик, а не программист и програмил тока ес...   Nov 21 2006, 19:14
|- - defunct   Цитата(zorromen @ Nov 21 2006, 19:14) а ч...   Nov 21 2006, 20:24
|- - _Bill   Цитата(zorromen @ Nov 21 2006, 19:14) я р...   Nov 22 2006, 16:20
|- - Serg79   Цитата(zorromen @ Nov 21 2006, 19:14) я р...   Nov 23 2006, 15:32
- - zorromen   да...хотя если работает то и ладно...кто там будет...   Nov 21 2006, 21:24
- - zorromen   На Сях уже и так все написано...А преподу и так вс...   Nov 23 2006, 21:51


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

 


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


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