2011-01-06 8 views
13

Jest to podchwytliwe pytanie C zadane w wywiadzie: Napisz program, który nie robi nic, nawet nie zabiera pamięci.Czy można napisać program w C, który nic nie robi - nie zabiera nawet pamięci?

Czy można to zrobić?

+1

Określ dokładnie, co masz na myśli, biorąc pamięć? Czy oznacza to, że program nie może przydzielić żadnej pamięci do stosu wywołań i/lub sterty lub użyć jakiejkolwiek pamięci po uruchomieniu? – Argote

+0

@mr_eclair: dołącz tag rozmowy, jeśli jest to pytanie do wywiadu. –

+19

unikaj tego pracodawcy. Nie mają pojęcia, o co pytają. –

Odpowiedz

35

Wszystkie programy korzystają z pamięci. Po uruchomieniu programu system ustawi przestrzeń adresową dla programu, skopiuje jego argumenty do przestrzeni procesowej, nadadzą mu identyfikator procesu i wątek, nadaj mu pewne deskryptory plików dla operacji we/wy itp. Nawet jeśli program natychmiast kończy działanie, nadal zużywasz tę pamięć i czas procesora.

+0

+1 Dziękuję .. –

4

Nie jest to niemożliwe. Kod i stos muszą iść gdzieś i to prawie zawsze pozostanie w pamięci.

Zignorowanie tego na pewno jest dość łatwe do napisania aplikacji, która natychmiast wychodzi.

+0

"prawie zawsze"? Gdzie indziej będzie kod i stos, ale w pamięci? –

+1

@Martin: Niektóre maszyny mają "pamięć kodów" i "pamięć stosu". Przypuszczam, że jest to wciąż pamięć ... ale nie jest pamięcią w rozumieniu malloc, ponieważ pochodzi z zupełnie innej puli. – Goz

2

Twoja odpowiedź powinna być zgodna z pytaniem, "dlaczego" chcesz coś takiego zrobić. to wskazywałoby na swobodę myślenia poza tym pytaniem.

+3

A jeśli jego wykładowcy są kimś podobnym do mnie ... zawiedzie go za bycie mądrym osłem. Tak się cieszę, że opuściłem uniwersytet (bardzo się cieszę, że opuściłem stronę naukową ... zabawa i spanie przez cały dzień była raczej przyjemna;)). – Goz

+0

Napiję się tego ... zzzz !! :-) –

+1

Właściwie to myślę, że pytanie, dlaczego chcesz to zrobić, nie jest w tym przypadku doskonałym pytaniem. Jest to sztuczne lub hipotetyczne pytanie badające niektóre ważne pojęcia - sam program zerowy nie musi być wartościowy, jeśli myśl, próbując go wyprodukować, czegoś uczy. Czasami podróż jest jego własną nagrodą. – djna

1

Na powierzchni pytanie wydaje się mieć prostą odpowiedź: "Nie, nie można tego zrobić". @templatetypedef podał kilka powodów.

Być może jednak chodzi o to, aby się przekonać, jak się do tego odnosi. Możesz otrzymać "znaki" za pytanie "jakiego rodzaju pamięć" lub za obserwowanie niektórych punktów, które zrobił @templatetypedef. Lub pokazując pustą metodę main() podaną przez @Mihran Hovsepyan, a następnie wyjaśniając, że niektóre pamięci będą włączone nawet w tym minimalnym przypadku.

0

Pusty program to program, prawda?

Poniżej jest mój program nie wykorzystanie zasobów :)


Należy również pamiętać, że. Ściśle mówiąc, program naprawdę nie zużywa żadnego zasobu, dopóki system operacyjny nie załaduje go i nie uruchomi. Kiedy to się stanie, nazywamy to procesem.

1

Chociaż przy uruchamianiu programu będzie trochę pamięci przydzielonej przez system operacyjny, większość ludzi nie wie, że main() nie jest rzeczywistym punktem wejścia programu. mainCRTStartup jest, przynajmniej w aplikacji konsoli Windows. Jeśli utworzysz program z rzeczywistym punktem wejścia, unikniesz procedur inicjalizacji sterty, parsowania argumentów poleceń, inicjalizacji zmiennych globalnych i tak dalej.

W pewnym sensie można zrobić program, który unika zarządzania stosem i tym podobnych rzeczy. Ale system operacyjny nadal będzie go czytał w pamięci.

Patrz: http://www.catch22.net/tuts/minexe

0

Poprawną odpowiedzią jest to, że realizacja specyficznych. Wdrożenie może obsługiwać puste programy, a mechanizm execve (lub równoważny) mógłby wykonać odpowiednik _Exit(0), gdy napotkałby jeden, ale w praktyce tak nie jest.

+2

Dalsi opieka wyjaśnić? –

Powiązane problemy