Καλησπέρα.
Λόγο του ότι θέλω να γίνω game developer και επίσης θέλω να ασχοληθώ με την γνώση game engine architecture
έπρεπε να μάθω c++.
Είμαι έμπειρος προγραμματιστής που γνωρίζω πολύ καλά αντικειμενοστραφή προγραμματισμό.
Οι γλώσσες που γνωρίζω είναι c, java, python και λίγο c#.
Εδώ και λίγες μέρες άρχισα να μαθαίνω c++.
Έχω μάθει την σύνταξη της γλώσσα (δεν διαφέρει και τόσο από c) και επίσης έμαθα λίγα καινούρια πρότυπα από
c++ 11.
Αυτό που φοβάμαι κυρίως και σίγουρα δεν γνωρίζω καλά είναι το πως να διαχειρίζομαι την μνήμη
όταν κάνω δομές δεδομένων χρησιμοποιώντας κλάσεις. Για παράδειγμα εάν κάνω μία συνδεδεμένη
λίστα ή ένα δένδρο τη ακριβώς πρέπει να προσέχω; Πως απελευθερώνω μνήμη; Υπάρχει garbage collector;
Επίσης απ'ότι έψαξα λίγο, το scope των αντικειμένων που δημιουργούνται έχει μεγάλη σχέση.
Τα αντικείμενα καταστρέφονται όταν το πρόγραμμα "φύγει" από το scope στο οποίο υπάρχουν.
Άρα τη πρέπει να προσέχω σε αυτήν την περίπτωση. Δηλαδή εάν έχω μία συνάρτηση που καλείται
από την main και μέσα σε αυτήν έχω αντικείμενα κλάσεων , θα καταστραφούν όταν επιστρέψει
στην main (και θα κληθεί ο deconstructor; ); Δηλαδή εάν με κάποιον τρόπο μπορώ να αναφερθώ
σε κάποιο αντικείμενο που δημιουργήθηκε από μια άλλη κλάση η οποία έχει ήδη επιστρέψει
δεν θα μπορώ να το κάνω επειδή το αντικείμενο έχει ήδη καταστραφεί; Αυτό ισχύει μόνο
για αυτό:ή και για αυτό:Κώδικας:My_Class_Name object;;Κώδικας:My_Class_Name object = new Object();
Πρέπει να τις λύσω αυτές τις απορίες προτού αρχίσω σοβαρή δουλειά.
Ευχαριστώ.
Εμφάνιση 1-5 από 5
-
14-07-16, 18:03 Από Java Σε C++ τη διαφορές πρέπει να έχω στο νου μου; #1
Τελευταία επεξεργασία από το μέλος babaliaris : 14-07-16 στις 18:09.
-
15-07-16, 00:39 Απάντηση: Από Java Σε C++ τη διαφορές πρέπει να έχω στο νου μου; #2
Καλησπέρα, εγώ έκανα ακριβώς την ανάποδη διαδικασία, έμαθα πρώτα c++ και μετά πήγα σε άλλες γλώσσες (c#, java).
Η C++ είναι υπερβολικά δυνατή αλλά έχει το κακό ότι πρέπει να διαχειρίζεσαι μόνος σου τη μνήμη! Δεν υπάρχει garbage collector οπότε όπου δεσμεύεις εσύ μνήμη (μέσω του new) θα πρέπει αντίστοιχα να την αποδεσμεύεις! Συνήθως αν έχεις κλάσεις που έχουν σαν μεταβλητές δείκτες, χρησιμοποιείς το destructor για να την αποδεσμεύσεις! Αν δεν την αποδεσμεύσεις έγκειται στο σύστημα αν θα το κάνει κάποια στιγμή (σίγουρα αφού κλείσεις το πρόγραμμά σου).
Αυτό που λες για το scope των μεταβλητών, είναι ακριβώς το ίδιο με την Java, C#! Όπως και εκεί κάθε φορά που τελειώνει ένα block αυτόματα καταστρέφονται οι μεταβλητές που ορίστηκαν μέσα σε αυτό. Όπως και στις άλλες γλώσσες θα καταστραφούν τόσο οι απλές μεταβλητές (int, float, MyClass κτλ) όσο και οι δείκτες (int*, float*, MyClass*).
Η C++ επειδή δεν έχει garbage collector δεν θα ψάξει ποτέ να βρει ότι δεν υπάρχει reference σε κάποια θέση που έχει δεσμέυσει οπότε δεν θα πάει ποτέ να το αποδεσμεύσει! Οπότε θα έχεις ένα δεσμευμένο χώρο στη μνήμη (μέσω της new) για τον οποίο όμως δεν θα έχεις κανένα Pointer οπότε δεν θα μπορέσεις ποτέ να τον αποδεσμέυσεις!
Γενικότερα πρέπει να θυμάσαι ότι για κάθε new πρέπει να υπάρχει και ένα delete το οποίο θα εκτελείται! Το ίδιο ισχύει και για τις δομές δεδομένων. Αν τις φτιάξεις ή τις χρησιμοποιείς με δείκτες τότε να φροντίσεις να τις αποδεσμεύεις κιόλας! Αν τις χρησιμοποιείς σαν MyClass x; τότε την αποδεσμεύει η c++ μόλις βγει εκτός scope!
Αν έχεις μάθε c σε γενικές γραμμές δεν έχεις τίποτα να φοβάσαι (τουλάχιστον στο κομμάτι μνήμης). Ότι δεσμεύεις το αποδεσμεύεις και τέλος! Απλά θα μάθεις λίγο την διαφορετική σύνταξη της C++, δλδ Classes, References, Overloading!
Ελπίζω να σε βοήθησα και να μην σε μπέρδεψα χειρότερα !Τελευταία επεξεργασία από το μέλος MitsakosGR : 15-07-16 στις 00:47.
-
15-07-16, 12:28 Απάντηση: Από Java Σε C++ τη διαφορές πρέπει να έχω στο νου μου; #3
Με βοήθησες πάρα πολύ! Επειδή από χθες το έψαχνα και λίγο μόνος μου έχω καταλάβει τη παίζει. Ένα πράμα που είδα και μου έκανε εντύπωση
είναι το εξής:
Καλό είναι με την c++ 11 να χρησιμοποιώ smart pointers και όχι απλούς pointers.
Λένε ότι όταν έχω έναν pointer απλό της c++ τότε μπορεί να με πετάξει κάποιο exception και
να αφήσει κάτι που το λένε leak νομίζω (θα ήθελα να μου το εξηγήσεις λίγο αυτό), επομένως
αν αργότερα έχω κάποιο delete δεν θα δουλέψει;
Ενώ οι smart pointers κάνουν αυτόματα delete όταν το πρόγραμμα φύγει από το scope στο οποίο έχουν οριστεί
και διαχειρίζονται αυτόματα όποιο exception προκληθεί.
Επίσης ο destructor είναι κάτι που δεν το ήξερα καν. Δεν ξέρω αν υπάρχει στην java κιόλας.
O destructor καλείτε όταν τελειώσει το πρόγραμμα ή όταν η εκτέλεση του προγράμματος φύγει
από το scope στο οποίο έχει οριστεί το αντικείμενο;
Επίσης αυτό :Κώδικας:Class_name obj_name = new Class_name ();
Κώδικας:Class_name obj_name;
Τελευταία επεξεργασία από το μέλος babaliaris : 15-07-16 στις 12:34.
-
15-07-16, 16:10 Απάντηση: Από Java Σε C++ τη διαφορές πρέπει να έχω στο νου μου; #4
Smart pointers δεν έχω δουλέψει (τώρα τους άκουσα πρώτη φορά) οπότε δεν γνωρίζω να σου πω!
Αυτό που ισχύει με το leak είναι στην ουσία να μην έχεις τίποτα να δείχνει σε δεσμευμένη μνήμη! Σκέψου το ακόλουθο παράδειγμα:
Κώδικας:void test() { int a = 5; int * x; x = new int[5]; } int main () { test(); }
Καλείται η new η οποία δεσμεύει χώρο για 5 int. Στην συνέχεια η test() ολοκληρώνεται και η c++ αποδεσμεύει την μνήμη των μεταβλητών. Άρα διαγράφεται η μεταβλητή a τύπου int και η μεταβλητή x τύπου int*.
Διαγράφοντας το a (ή αντίστοιχα κάποιο αντικείμενο ορισμένο με Myclass a; ) αυτόματα διαγράφεται και η μνήμη που έχει δεσμεύσει το αντικείμενο αυτό.
Διαγράφοντας το x πάλι διαγράφεται η μνήμη που έχει δεσμευτεί ΓΙΑ το int*. Όχι ΑΠΟ το int* !!! Έτσι έχεις δεσμεύσει μνήμη μέσα από το x για την οποία όμως δεν έχεις καμία αναφορά (pointer) για να μπορέσεις να κάνεις delete. Αυτό λέγεται memory leak. Αν έχεις έστω και έναν Pointer να δείχνει σε δυναμικά δεσμευμένη μνήμη τότε δεν αποτελεί leak γιατί μπορείς να κάνεις delete. Το πρόβλημα είναι όταν δεν έχεις κανέναν!
Deconstructor δεν υπάρχει στις άλλες γλώσσες γιατί δεν μπορείς να ξέρεις πότε θα καταστραφεί το αντικείμενο (όταν αποφασίσει να το μαζέψει ο garbage collector). Στην C++ όμως ο destructor καλείται αυτόματα μόλις γίνει delete ένα δυναμικά δεσμευμένο αντικείμενο (Class_name * obj_name = new Class_name ();) ή όταν βγει out of scope ένα απλά δεσμευμένο αντικείμενο (Class_name obj_name;).
-
15-07-16, 16:20 Απάντηση: Από Java Σε C++ τη διαφορές πρέπει να έχω στο νου μου; #5
Πω πραγματικά ευχαριστώ πολύ! Αυτές οι λεπτομέρειες είναι πολύ χρήσιμες και πρέπει να τις ξέρω.
Εντάξει τώρα πιστεύω είμαι μια χαρά. Διάβασα και έναν άρθρο στο interner που εξηγεί πολύ καλά τις λειτουργίες
new και delete αλλά και memory leak. Σε συνδυασμό με την απάντησή σου τώρα πιστεύω είμαι μια χαρά.
Παρόμοια Θέματα
-
Διπλοεγγραφές στο CDR μετά από αναβάθμιση σε Asterisk 13 και FreePBX 13
Από dimangelid στο φόρουμ Voice over IP (VoIP) SoftwareΜηνύματα: 5Τελευταίο Μήνυμα: 25-09-16, 15:20 -
False warning από τον Chrome στο blog μου
Από chek2fire στο φόρουμ Internet, web surfing και online υπηρεσίεςΜηνύματα: 0Τελευταίο Μήνυμα: 13-07-16, 14:52 -
Drivers σε windows 10 - Τι πρεπει να εγκατασταθει?
Από DJman στο φόρουμ WindowsΜηνύματα: 10Τελευταίο Μήνυμα: 28-04-16, 14:45 -
Προβληματακι σε C στο οποιο δεν μπορω να βρω την λυση.
Από zaranero στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμούΜηνύματα: 24Τελευταίο Μήνυμα: 28-01-16, 03:11 -
Οι κάτοχοι του Samsung Galaxy Note 5 πρέπει να προσέχουν στο πώς τοποθετούν το πενάκι στην συσκευή
Από nnn στο φόρουμ ΕιδήσειςΜηνύματα: 35Τελευταίο Μήνυμα: 02-09-15, 18:57
Bookmarks