Junior
Πώς χρησιμοποιούνται η στοίβα και η σωρός στη μνήμη;
sobes.tech AI
Απάντηση από AI
Η στοίβα χρησιμοποιείται για την αποθήκευση τοπικών μεταβλητών, παραμέτρων συναρτήσεων και διευθύνσεων επιστροφής. Η μνήμη διανέμεται και απελευθερώνεται αυτόματα σύμφωνα με την αρχή LIFO (Last-In, First-Out).
Ο σωρός (Heap) χρησιμοποιείται για δυναμική κατανομή μνήμης για αντικείμενα του οποίου το μέγεθος είναι άγνωστο κατά τη διάρκεια της μεταγλώττισης ή η διάρκεια ζωής τους υπερβαίνει το πεδίο στο οποίο δημιουργούνται. Η διαχείριση μνήμης στον σωρό γίνεται χειροκίνητα ή μέσω μηχανισμών διαχείρισης μνήμης (ARC στο Swift, garbage collector σε άλλες γλώσσες).
| Χαρακτηριστικό | Στοίβα | Σωρός |
|---|---|---|
| Κατανομή | Αυτόματη | Δυναμική (χειροκίνητα ή με MRC/ARC) |
| Απελευθέρωση | Αυτόματα κατά την έξοδο από το πεδίο | Χειροκίνητα (free) ή με MRC/ARC |
| Μέγεθος δεδομένων | Γνωστό κατά τη μεταγλώττιση | Μπορεί να είναι άγνωστο μέχρι την εκτέλεση |
| Πρόσβαση | Γρήγορη, διαδοχική | Αργότερη, τυχαία |
| Δομή | LIFO | Γράφος αντικειμένων |
| Παραδείγματα | Τοπικές μεταβλητές, παράμετροι συναρτήσεων | Αντικείμενα κλάσεων, δομές με μεταβλητό μέγεθος |
// Παράδειγμα χρήσης της στοίβας και του σωρού σε Swift
func myFunction() {
// Τοπική μεταβλητή στη στοίβα
var stackVariable: Int = 10
// Αντικείμενο κλάσης στον σωρό
let heapObject = MyClass()
// Τύπος τιμής στη στοίβα (εκτός από δομές που περιέχουν αναφορικούς τύπους)
var stackStruct = MyStruct()
// Δομή που περιέχει αναφορικό τύπο, μέρος μπορεί να βρίσκεται στον σωρό
var mixedStruct = MyMixedStruct()
}
class MyClass {
// Τα χαρακτηριστικά του αντικειμένου αποθηκεύονται στον σωρό
var property: String = "Hello"
}
struct MyStruct {
// Τα χαρακτηριστικά τύπου τιμής αποθηκεύονται στη στοίβα
var property: Int = 20
}
class MyReferenceType {
var value: Int = 30
}
struct MyMixedStruct {
// Τύπος τιμής στη στοίβα
var stackProperty: Int = 40
// Αναφορικός τύπος στον σωρό (η ίδια η αναφορά στη στοίβα)
var heapReference: MyReferenceType = MyReferenceType()
}