Выделение памяти в стеке

Aug 27, 2006 3 Replies

в С99 можно память в стеке выделять



nb:[/home/dimka/tmp]$ > test.c #include <stdio.h>



long long factorial(int n) { int array[n]; for (int i=0; i<n; i++) array[i]=i+1;



long long result=1;



for (int i=0; i<n; i++) result*=array[i]; return result; }


int main(int argc, char **argv) { printf("factorial %d=%lld\n" "factorial %d=%lld\n", 10, factorial(10), 15, factorial(15)); } ^D nb:[/home/dimka/tmp]$ gcc -std=c99 test.c -o test nb:[/home/dimka/tmp]$ ./test factorial 10=3628800 factorial 15=1307674368000


кто-нибудь делал тесты насчет того насколько это эффективнее/неэффективнее malloc?



Привет, Dmitry !

27 Aug 06 , 13:41 Dmitry E. Oboukhov писал к All:

DEO> long long factorial(int n) DEO> { DEO> int array[n]; [skip]

DEO> кто-нибудь делал тесты насчет того насколько это DEO> эффективнее/неэффективнее malloc?

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

. С уважением, Hикита. icq:240059686, lj-user:nicka_startcev ... Я матернулся чтоб узнат не матэрнулас ли оно чтоб узнат не матэрнулся ли я

DO>> в С99 можно память в стеке выделять DL>

DO>> long long factorial(int n) DO>> { DO>> int array[n]; DO>> for (int i=0; i<n; i++) array[i]=i+1; DL>

DO>> long long result=1; DL>

DO>> for (int i=0; i<n; i++) result*=array[i]; DO>> return result; DO>> } DL>

DL> Зачем здесь вообще память выделять по массив ? DL>

DO>> кто-нибудь делал тесты насчет того насколько это DO>> эффективнее/неэффективнее malloc? DL>

DL> Выделение памяти на стеке всегда эффективнее всяких malloc из-за принципа DL> работы хипа. DL> Только вот временем жизни объекта на стеке так просто управлять не DL> получится, да и стека часто DL> гораздо меньше, чем хипа. про время жизни оно понятно :)

просто много задач где память выделяется подо что-то потом это что-то вызывается с указателем на выделенную память, потом результат обрабатывается и память освобождается :) вот я и подумываю переползти чтоли на С99?

Hello Dmitry.

05 Sep 06 10:05, you wrote to me:

DL>>

DL>> Выделение памяти на стеке всегда эффективнее всяких malloc из-за DL>> принципа работы хипа. DL>> Только вот временем жизни объекта на стеке так просто управлять DL>> не получится, да и стека часто гораздо меньше, чем хипа. DO> про время жизни оно понятно :)

DO> просто много задач где память выделяется подо что-то DO> потом это что-то вызывается с указателем на выделенную память, DO> потом результат обрабатывается и память освобождается :) DO> вот я и подумываю переползти чтоли на С99?

В любом случае надо весьма хорошо представлять себе то, что делаешь, выделение на стеке любым способом int MyArray[32768]; Может привести к весьма забавным последствиям в условиях сильно ограниченного стека, тогда как malloc просто возвратит NULL. А вообще классики говорят, что все беды - от premature optimisation :)

Dmitry

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required