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

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

Δημοσ.

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

 

Ποιος είναι ο οικονομικότερος τύπος δεδομένων για αυτά εδώ: "one", "two", "three"

 

Η σωστή απάντηση char p[] ή char *p δεν είναι; Και τα δύο 4 bytes δε θέλουν γιατί είναι δείκτες;

Δημοσ.

Έκανα, και τα δύο 4 βγάζουν! Αλλά από την άλλη μήπως η λογική είναι:

 

π.χ για το "one":

 

για τον δείκτη έχω 4 bytes

για τον πίνακα έχω 1+1+1 byte=3 bytes, 1 byte για κάθε χαρακτήρα;;

 

εδιτ: για τον πίνακα θέλω 4 bytes γτ είναι και το backslash 0 στο τέλος! άρα είναι ίσα

 

Άρα συμφέρει πιο πολύ πίνακας χαρακτήρων για το "one","two" και δείκτης char για το "three"???

  • Moderators
Δημοσ.

Το μέγεθος δε σου λέει κανείς ότι είναι 4. Τυχαίνει στο δικό σου pc με το συγκεκριμένο compiler να είναι 4. Τι προσπαθείς να πετύχεις όμως; Ψάχνεις πώς θα σώσεις 2 bytes το σωτήριον έτος 2000 + 17; Και να δούλευε έτσι όπως λες εσύ, υπάρχουν παράγοντες οι οποίοι δεν ελέγχεις (OS). Το λειτουργικό δεν κάθεται να δίνει ένα-ένα byte στο πρόγραμμά σου κάθε φορά που το ζητάς, σου δίνει μνήμη σε πακέτα. Οπότε είτε 5 bytes είναι αυτά που έχεις είτε 3, θα πάρεις 16K απ' το λειτουργικό χωρίς να το πολυαπασχολεί πόσα θα χρησιμοποιήσεις εσύ (το 16K είναι τυχαίο νούμερο).

 

ΥΓ. Also google premature optimization.

Δημοσ.

Θέμα εξεταστικής είναι φίλε μου, στις 6 γράφω. Κάθε χρόνο βάζει ένα τέτοιο θέμα όπου δίνει τέτοια strings ή αριθμούς και σου ζητάει τον οικονομικότερο τύπο δεδομένων για να το αποθηκεύσεις. Π.χ αν δώσει το 200 λες unsigned char επειδή πιάνει 1 byte ενώ πχ σε int θα θέλει 4 bytes. 

 

Οι τιμές αυτές είναι στις διαφάνειες και στο βιβλίο που έχουμε οπότε με βάση αυτά πορευόμαστε.

  • Moderators
Δημοσ.

Αααα μάλιστα, ακόμα ένα βοηθητικό και σοβαρό θέμα. Απ' αυτά που καταλαβαίνω από την τελευταία έκδοση του standard και απ' αυτά τα λίγα που ξέρω ήδη, η ερώτηση αυτή δεν έχει νόημα. Μια σκέψη, την οποία δε θα έπρεπε να λάβεις σοβαρά, είναι ότι με signed char θα πιάνει λιγότερο χώρο επειδή το signed char δεν έχει padding, αλλά δεν ξέρω ούτε C καλά ούτε αυτά τα low level του σατανά για να σου πω έτσι είναι.

Μπορεί να σου ακούγεται εξυπνακίστικη απάντηση κλπ η οποία δε βοηθάει, αλλά με τέτοιες ερωτήσεις που βάζουν θα σου έλεγα να κοιτάξεις στις σημειώσεις να δεις εκεί αν σου λέει ότι πχ το char πιάνει 1 byte, το int 4 bytes κλπ.

Δημοσ.

Μα έτσι είναι ξέρω πόσο πιάνει το καθένα :P Δυστυχώς και εγώ πιστεύω δεν είναι σοβαρά θέματα αλλά κάπως πρέπει να εξετάσει κάποια παραπάνω πράγματα, τι να πω...

 

Ορίστε το πινακάκι: CtyL2vb.png

Δημοσ.

Ο pointer δεσμευει 4 bytes για να αποθηκευσει την διευθυνση στην οποια ξεκινουν τα δεδομενα που του εθεσες.

Επομενος ενα char* n = "lal" δεσμευει 4 + 3 bytes.

 

Τωρα μεταξυ pointer και πινακα δε ξερω αν υπαρχει διαφορα.

Δημοσ.

Ποιος είναι ο οικονομικότερος τύπος δεδομένων για αυτά εδώ: "one", "two", "three"

 

Η σωστή απάντηση char p[] ή char *p δεν είναι; Και τα δύο 4 bytes δε θέλουν γιατί είναι δείκτες;

Καταρχάς, όπως σου είπε ο Kercyn, δεν είναι σίγουρο ότι θα καταλαμβάνουν 4 bytes (στο πιο σύνηθες μοντέλο 64bit για παράδειγμα θα έχεις 8 bytes για τους δείκτες) αλλά ας πορευτούμε με αυτό το δεδομένο ότι δείκτης == 4 bytes.

 

Με δεδομένο ότι μιλάμε για string literals δηλαδή για τις στατικές αυτές λέξεις χωρίς να θέλεις κάποια στιγμή στο μέλλον να αλλάξεις το "one" σε "one more", και χωρίς καθόλου βελτιστοποιήσεις από τον compiler, τότε θα χρησιμοποιήσεις p[].

 

Όταν δηλώσεις char p[] = "one" (αυτό είναι ισοδύναμο με την έκφραση char p[4] = "one"), τότε ο compiler θα εκχωρήσει μνήμη όση χρειάζεται για αυτό ακριβώς το string (αυτό φυσικά θεωρητικά, πρακτικά μπορεί να εκχωρήσει 256bytes γιατί έτσι τον βολεύει). Έπειτα μπορείς να αλλάξεις τιμή σε οποιαδήποτε από τις 4 αυτές θέσεις μνήμης.

 

Όταν δηλώσεις char *p = "one", τότε γίνεται κάτι διαφορετικό. Το string "one" αποθηκεύεται σε κάποια περιοχή μνήμης (συνήθως read-only) και εκχωρείται επίσης όση μνήμη χρειάζεται για ένα δείκτη ο οποίος μετά δείχνει στην περιοχή του "one". Σε αυτή την περίπτωση δεν μπορείς να αλλάξεις τιμή και να το κάνεις "wne".

 

Έτσι λοιπόν, με p[] θα χρησιμοποιήσεις το ελάχιστο των 4 bytes ενώ με *p θα έχεις 4 για το string και άλλα 4 για τον δείκτη.

 

π.χ για το "one":

 

για τον δείκτη έχω 4 bytes

για τον πίνακα έχω 1+1+1 byte=3 bytes, 1 byte για κάθε χαρακτήρα;;

 

εδιτ: για τον πίνακα θέλω 4 bytes γτ είναι και το backslash 0 στο τέλος! άρα είναι ίσα

 

Άρα συμφέρει πιο πολύ πίνακας χαρακτήρων για το "one","two" και δείκτης char για το "three"???

Όχι. Δες αυτό που έγραψα πριν. Ο πίνακας θα καταλαμβάνει πάντα τον αριθμό γραμμάτων του string + 1 ακόμη για το \0 και ο δείκτης θα καταλαμβάνει αυτό + όσο χρειάζεται για ένα δείκτη. Δεν παίζει ρόλο το μέγεθος του "three" που είναι μεγαλύτερο.

 

Θέμα εξεταστικής είναι φίλε μου, στις 6 γράφω. Κάθε χρόνο βάζει ένα τέτοιο θέμα όπου δίνει τέτοια strings ή αριθμούς και σου ζητάει τον οικονομικότερο τύπο δεδομένων για να το αποθηκεύσεις. Π.χ αν δώσει το 200 λες unsigned char επειδή πιάνει 1 byte ενώ πχ σε int θα θέλει 4 bytes. 

 

Οι τιμές αυτές είναι στις διαφάνειες και στο βιβλίο που έχουμε οπότε με βάση αυτά πορευόμαστε.

Ό,τι λέγαμε και σε ένα άλλο θέμα προχτές. Άλλη μία χρήσιμη ερώτηση από καθηγητές :)

 

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

 

Γράψε ότι θα μετατρέψεις τα "one", "two", "three" σε 1, 2, 3 και θα τα αποθηκεύσεις σε char οπότε θες 1 byte :)

Δημοσ.

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

 

Ποιος είναι ο οικονομικότερος τύπος δεδομένων για αυτά εδώ: "one"

 

 

MFW

#include <stdio.h>

struct __attribute__((packed)) __attribute__((gcc_struct)) financial_data_type {
    unsigned char a : 7;
    unsigned char b : 7;
    unsigned char c : 7;
    unsigned char nul : 1;
};

int main(void)
{
    struct financial_data_type economy = {.a = 'o', .b = 'n', .c = 'e', .nul = '\0'};
    char str[4];

    printf("%u\n", sizeof economy);
    str[0] = (char)economy.a;
    str[1] = (char)economy.b;
    str[2] = (char)economy.c;
    str[3] = (char)economy.nul;

    printf("%s\n", str);

    return 0;
}

(gcc only)

 

 

 

Γράψε ότι θα μετατρέψεις τα "one", "two", "three" σε 1, 2, 3 και θα τα αποθηκεύσεις σε char οπότε θες 1 byte :)

χαχαχ μ' αρεσε αυτο. Petition να αλλαξεις το user σου απο imitheos σε theos :P

  • Moderators
Δημοσ.

MFW

#include <stdio.h>

struct __attribute__((packed)) __attribute__((gcc_struct)) financial_data_type {
    unsigned char a : 7;
    unsigned char b : 7;
    unsigned char c : 7;
    unsigned char nul : 1;
};

int main(void)
{
    struct financial_data_type economy = {.a = 'o', .b = 'n', .c = 'e', .nul = '\0'};
    char str[4];

    printf("%u\n", sizeof economy);
    str[0] = (char)economy.a;
    str[1] = (char)economy.b;
    str[2] = (char)economy.c;
    str[3] = (char)economy.nul;

    printf("%s\n", str);

    return 0;
}

(gcc only)

 

Τι βγάζει αυτό; Είμαι περίεργος...

Δημοσ.

Η πληροφορική στα Ελληνικά Δημόσια Πανεπιστήμια έχει μείνει πολύ πίσω.

 

Δεν έχει νόημα να χαλάς τον χρόνο σου να ανακαλύψεις μια δομή για να κερδίσεις μερικά Bytes όταν οι σημερινοί υπολογιστές έχουν το ελάχιστο 4GB RAM.

 

Η πληροφορική που διδάσκουν στα ΑΕΙ μας είναι με βάση υπολογιστές του 2000, όπου με 256ΜΒ ΡΑΜ ήσουν άρχοντας. Πόσο μάλλον με 512,1γβ.

 

Νταξ... από την μια καλό είναι να γίνεται λόγος για να αποφεύγονται λάθη του τύπου (long int για το Health σε ένα παιχνίδι) αλλά και να ασχολούμαστε τόσο πολύ...

Δημοσ.

Τι βγάζει αυτό; Είμαι περίεργος...

 

Σε Windows και σε Linux δοκιμασμενο με GCC βγάζει 3 bytes (7 + 7 + 7 + 1 + 2 για το padding).

 

Εννοειται πως τετοιος κωδικας ειναι φαρσα και δεν εχει κανενα απολυτως νοημα να υπαρχει, απλα ηθελα να δειξω οτι γινεται. Συνηθως ειναι πιο αργη η αναγνωση θεσεων μνημης που δεν εχουν υποστει το καταλληλο alignment, οπως το κανει αυτοματα ο compiler.

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

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

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

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

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

Σύνδεση

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

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