Differenze tra le versioni di "Alloca ()"
(3 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
La funzione '''alloca()''' dichiarata nel file header "''/usr/include/alloca.h''" | La funzione '''alloca()''' dichiarata nel file header "''/usr/include/alloca.h''" | ||
void *alloca (size_t __size) | void *alloca (size_t __size) | ||
− | alloca una porzione di memoria che verrà liberata quando si esce dalla funzione di chiamata. La funzione ''alloca( )'' alloca byte quantità di spazio nello ''<SPAN Style="text-decoration:underline">stack</span>''. Questo spazio temporaneo allocato viene liberato automaticamente, quando la funzione che ha chiamato ''alloca( )'' torna al chiamante. | + | alloca una porzione di memoria che verrà liberata quando si esce dalla funzione di chiamata. La funzione ''alloca( )'' alloca byte quantità di spazio nello ''<SPAN Style="text-decoration:underline">stack</span>''. Questo spazio temporaneo allocato viene liberato automaticamente, quando la funzione che ha chiamato ''alloca( )'' torna al chiamante. <SUP>[[[#Note|Nota 1]]]</sup> |
<BR>La funzione ''alloca( )'' restituisce un Puntatore all'inizio dello spazio da essa allocato. | <BR>La funzione ''alloca( )'' restituisce un Puntatore all'inizio dello spazio da essa allocato. | ||
Riga 28: | Riga 28: | ||
− | + | Public Sub Main() | |
− | + | Dim p As Pointer | |
− | + | Dim i As Integer | |
− | + | Dim st As Stream | |
<FONT Color=gray>' ''Crea la nostra libreria dinamica condivisa per la gestione della funzione 'alloca()':''</font> | <FONT Color=gray>' ''Crea la nostra libreria dinamica condivisa per la gestione della funzione 'alloca()':''</font> | ||
Riga 42: | Riga 42: | ||
<FONT Color=gray>' ''Resta in attesa che sia inviato un dato numerico intero immesso dalla tastiera nello spazio sottostante la console o nel Terminale:''</font> | <FONT Color=gray>' ''Resta in attesa che sia inviato un dato numerico intero immesso dalla tastiera nello spazio sottostante la console o nel Terminale:''</font> | ||
+ | Print "Invia dalla console/Terminale un Intero..." | ||
Input i | Input i | ||
st = Memory p For Write | st = Memory p For Write | ||
Riga 50: | Riga 51: | ||
Print Int@(p) | Print Int@(p) | ||
− | + | End | |
− | + | Private Procedure Creaso() | |
File.Save("/tmp/Alloca.c", "#include <alloca.h>" & | File.Save("/tmp/Alloca.c", "#include <alloca.h>" & | ||
Riga 68: | Riga 69: | ||
Shell "gcc -o /tmp/Alloca.so /tmp/Alloca.c -shared" Wait | Shell "gcc -o /tmp/Alloca.so /tmp/Alloca.c -shared" Wait | ||
− | + | End | |
+ | |||
+ | |||
+ | =Note= | ||
+ | [1] La funzione "alloca()" alloca spazio sullo ''stack'' invece che nello ''heap''. | ||
+ | <BR>All'uscita della funzione "alloca()" lo spazio viene automaticamente rilasciato, risultando così non necessario chiamare la funzione "free()" per deallocare. | ||
Versione attuale delle 18:50, 12 giu 2024
La funzione alloca() dichiarata nel file header "/usr/include/alloca.h"
void *alloca (size_t __size)
alloca una porzione di memoria che verrà liberata quando si esce dalla funzione di chiamata. La funzione alloca( ) alloca byte quantità di spazio nello stack. Questo spazio temporaneo allocato viene liberato automaticamente, quando la funzione che ha chiamato alloca( ) torna al chiamante. [Nota 1]
La funzione alloca( ) restituisce un Puntatore all'inizio dello spazio da essa allocato.
Poiché detta funzione non è contenuta in alcuna libreria dinamica condivisa .so, si potrà fruire delle sue potenzialità richiamandola ed usandola all'interno di una libreria dinamica condivisa .so che dovrà essere da noi creata appositamente. Il suo codice sorgente, scritto nel progetto Gambas, potrà essere il seguente:
"/tmp/Alloca.c", "#include <alloca.h>" & "\n\n" & "char * Inizializza_Alloca (size_t dimen) {" & "\n\n" & " char * c;" & "\n\n" & " c = alloca(dimen);" & "\n\n" & " return c;" & "\n\n}"
Va sottolineato che il valore da passare alla funzione alloca(), relativo alla dimensione dell'area di memoria da allocare, non deve essere inferiore a 128 byte.
Mostriamo di seguito un esempio pratico sull'uso della funzione alloca(), la quale verrà utilizzata per allocare un blocco di memoria, puntato da un Puntatore, nel quale sarà scritto mediante i Memory Stream un valore numerico di tipo Intero immesso dalla tastiera.
Library "/tmp/Alloca" ' char * Inizializza_Alloca (size_t dimen) ' Invoca ed utilizza la funzione 'alloca()'. Private Extern Inizializza_Alloca(dimen As Long) As Pointer Public Sub Main() Dim p As Pointer Dim i As Integer Dim st As Stream ' Crea la nostra libreria dinamica condivisa per la gestione della funzione 'alloca()': Creaso() ' Invoca la funzione presente nella nostra libreria dinamica condivisa contenente il codice per la gestione della funzione 'alloca()': p = Inizializza_Alloca(256) If p = 0 Then Error.Raise("Impossibile allocare memoria con 'alloca()' !") ' Resta in attesa che sia inviato un dato numerico intero immesso dalla tastiera nello spazio sottostante la console o nel Terminale: Print "Invia dalla console/Terminale un Intero..." Input i st = Memory p For Write Write #st, i As Integer st.Close ' Stampa in console o nel Terminale il valore numerico intero immesso con la tastiera: Print Int@(p) End Private Procedure Creaso() File.Save("/tmp/Alloca.c", "#include <alloca.h>" & "\n\n" & "char * Inizializza_Alloca (size_t dimen) {" & "\n\n" & " char * c;" & "\n\n" & " c = alloca(dimen);" & "\n\n" & " return c;" & "\n\n}") Shell "gcc -o /tmp/Alloca.so /tmp/Alloca.c -shared" Wait End
Note
[1] La funzione "alloca()" alloca spazio sullo stack invece che nello heap.
All'uscita della funzione "alloca()" lo spazio viene automaticamente rilasciato, risultando così non necessario chiamare la funzione "free()" per deallocare.
Riferimenti
- http://man7.org/linux/man-pages/man3/alloca.3.html
- http://www.gnu.org/software/libc/manual/html_node/Variable-Size-Automatic.html
- http://programmers.stackexchange.com/questions/116117/should-i-teach-my-students-alloca
- https://www.strchr.com/alloca
- http://stackoverflow.com/questions/9144686/alloca-function-in-c
- http://stackoverflow.com/questions/1018853/why-is-the-use-of-alloca-not-considered-good-practice