Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Αν πιστεύεις ότι είναι τόσο απλοί πες μου λίγο με δικά σου λόγια τι λέει ο strict aliasing rule που είναι σούπερ βασικός (undefined behavior ντε!) χωρίς να ανατρέξεις κάπου.

 

Πού είναι το δύσκολο? Ο κανόνας ουσιαστικά λέει ότι δε πρέπει να αλλάζεις τον τύπο ενός δείκτη ενώ ακόμα χρησιμοποιείς και τον προηγούμενο, επειδή τότε ο compiler δε θα μπορεί να προβλέψει πότε άλλαξε τι ώστε να κάνει λίγο optimization. Για τη C, το volatile χρησιμοποιείται όταν πρέπει να γίνει έτσι, λέει στον compiler "Ψιτ, πρόσεχε, να μην υποθέσεις τι μπορεί να υπάρχει εδώ μέσα!"

 

Με άλλα λόγια, "Μη χειρίζεσαι τη μνήμη με παραπάνω από ένα τρόπους στο ίδιο σημείο".

Δημοσ.

Πού είναι το δύσκολο? Ο κανόνας ουσιαστικά λέει ότι δε πρέπει να αλλάζεις τον τύπο ενός δείκτη ενώ ακόμα χρησιμοποιείς και τον προηγούμενο, επειδή τότε ο compiler δε θα μπορεί να προβλέψει πότε άλλαξε τι ώστε να κάνει λίγο optimization. Για τη C, το volatile χρησιμοποιείται όταν πρέπει να γίνει έτσι, λέει στον compiler "Ψιτ, πρόσεχε, να μην υποθέσεις τι μπορεί να υπάρχει εδώ μέσα!"

 

Με άλλα λόγια, "Μη χειρίζεσαι τη μνήμη με παραπάνω από ένα τρόπους στο ίδιο σημείο".

Για άλλη μια φορά ξεφεύγουμε βέβαια από το θέμα που είναι για συγκεκριμένο πρόβλημα σε c++ (ούτε καν για c) λέγοντας θεωρητικά θέματα.

 

Συμφωνώ και εγώ με αυτό που είπες ότι η C είναι απλή και το έχω αναφέρει πολλές φορές στο φόρουμ. Αυτό που εννοώ (και ίσως να μην το διατυπώνω σωστά με το "απλή") είναι ότι έχει πολύ μικρό συντακτικό, 5 τύπους, 4-5 τελεστές και 5-6 ιδιωματισμούς οπότε είναι εύκολο να μάθεις αυτό το κομμάτι.

c = a + b
Όταν βλέπεις το παραπάνω σε C καταλαβαίνεις αμέσως τι είναι ενώ σε άλλες γλώσσες τα a, b, c μπορεί να είναι οτιδήποτε, μπορεί τα = και + να είναι overloaded και να κάνουν 1002 πράγματα, κτλ.

 

Αυτό εννοώ εγώ ότι η γλώσσα είναι απλή. Από εκεί και πέρα όμως, στο πρακτικό κομμάτι, για να προγραμματίσεις μπαίνουν ένα κάρο άλλοι παράγοντες όπως αυτός που σωστά είπε ο defacer.

 

Εγώ κατάλαβα λίγο διαφορετικά αυτό που είπε ο defacer. Το ζήτημα δεν είναι τόσο να ξέρεις ότι υπάρχει αυτός ο κανόνας και ποιος είναι ο ορισμός του. Το ζήτημα είναι ότι ο κανόνας έχει τεράστια πλοκάμια και είναι γελοία εύκολο να τον παραβιάσει ένα (ακόμη και όχι μεγάλο) πρόγραμμα που χρησιμοποιεί δείκτες.

Δημοσ.

Εγώ κατάλαβα λίγο διαφορετικά αυτό που είπε ο defacer. Το ζήτημα δεν είναι τόσο να ξέρεις ότι υπάρχει αυτός ο κανόνας και ποιος είναι ο ορισμός του. Το ζήτημα είναι ότι ο κανόνας έχει τεράστια πλοκάμια και είναι γελοία εύκολο να τον παραβιάσει ένα (ακόμη και όχι μεγάλο) πρόγραμμα που χρησιμοποιεί δείκτες.

 

Ναι, μάλλον έχεις δίκιο, δεν το σκέφτηκα έτσι... Πρέπει να θυμίζω στον εαυτό μου ότι επειδή είναι εύκολα για εμένα, μετά από αρκετή εμπειρία βέβαια, δε σημαίνει ότι είναι τόσο εύκολα και για τους καινούργιους.

Δημοσ.

Ναι, μάλλον έχεις δίκιο, δεν το σκέφτηκα έτσι... Πρέπει να θυμίζω στον εαυτό μου ότι επειδή είναι εύκολα για εμένα, μετά από αρκετή εμπειρία βέβαια, δε σημαίνει ότι είναι τόσο εύκολα και για τους καινούργιους.

Ούτε για εσένα είναι εύκολα απλά σου φαίνονται εύκολα :) Αυτό είναι το όλο θέμα που θίγουμε με την C και την UB. Είναι γελοία εύκολο να υποπέσεις σε UB ακόμη και αν έχεις εμπειρία (μπορείς φυσικά να αποφύγεις UB αν έχεις το μυαλό σου συγκεκριμένα εκεί αλλά το 99% του χρόνου σου σε production code το μυαλό σου θα είναι πώς να υλοποιήσεις τον συγκεκριμένο αλγόριθμο που έχεις να υλοποιήσεις και όχι να αποφύγεις ub).

Δημοσ.

Ναι, συνεννοηθήκαμε.
 
Πάντως, Reaper, δες λίγο τι λέει το spec έτσι;
 

An object shall have its stored value accessed only by an lvalue expression that has one of
the following types:

— a type compatible with the effective type of the object,
— a qualified version of a type compatible with the effective type of the object,
— a type that is the signed or unsigned type corresponding to the effective type of the
object,
— a type that is the signed or unsigned type corresponding to a qualified version of the
effective type of the object,
— an aggregate or union type that includes one of the aforementioned types among its
members (including, recursively, a member of a subaggregate or contained union), or
— a character type

 

 

Δεν ξέρω τι ακριβώς είχες στο μυαλό σου (δεν έχει και σημασία), αυτό που ήθελα να πω είναι ότι ο συγκεκριμένος κανόνας είναι σαφώς εξαντλητικά ορισμένος και εύκολος να τον επικοινωνήσεις σε κάποιον που ήδη ξέρει πολλά... δοκίμασε όμως να το εξηγήσεις αυτό σε κάποιον που μαθαίνει, ή εναλλακτικά σου δίνω εγώ ένα πρόγραμμα και πες μου εσύ αν τον παραβιάζω πουθενά. Τρελλά γλέντια. Ευκολότερα λύνεις το halting problem.

 

Και τέλος το "μου φαίνονται εύκολα" (είτε με τώρα από μπροστά είτε χωρίς) δεν είναι κριτήριο. Είμαι σίγουρος ότι υπάρχει πολύς κόσμος που μπορείς να του εξηγήσεις σε 30 δευτερόλεπτα τι είναι higher order function και currying (να πεις την ουσία και τα υπόλοιπα να τα καταλάβουν μόνοι τους συμπερασματικά). Αυτός ο κόσμος όμως δεν είναι ο μέσος όρος.

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...