Εργαστήριο Τεχνολογίας Λογισμικού
0 votes
394 views

Πότε να χρησιμοποιούμε long long int και πότε απλό int; Υπάρχει κάποιος λόγος να μην τα βάζουμε όλα πάντοτε long long και να "ξεμπερδεύουμε";

in algorithms by (730 points) | 394 views

3 Answers

+3 votes

Όταν πρόκειται για μικρές αλγοριθμικές εφαρμογές δεν υπάρχει κάποιος λόγος να μην το χρησιμοποιείς παντού...

Σε εφαρμογές μεγάλης κλίμακας το να χρησιμοποιείς πχ long long int αντί για int παντού μπορεί να καταλήξει σε σημαντική διαφορά κατανάλωσης πόρων (μνήμη / cpu etc).

Επίσης δεδομένου οτι τα προγράμματά σας στα πλαίσια των μαθημάτων είναι περιορισμένα τόσο σε χρόνο όσο και σε χρήση μνήμης, μπορείς να διατηρείς και μια μικρή επιφύλαξη στα πλαίσια αυτά...
(πχ αν θες ενα array απο δεκάδες χιλιάδες αριθμούς, σκέψου άλλη μια φορά αν θες όντως αυτοί να είναι long long ints αντί για ints)

Οπότε δεν υπάρχει καθολικό "ναι" ή "όχι", το βέλτιστο είναι να κάνεις long long int τους αριθμούς που πρέπει να είναι long long int

by (3.0k points)
+3 votes

Το long long int παιρνει τη διπλασια μνημη απο το int, οποτε αν δεν το χρειαζεσαι γιατι να φας τοση μνημη ασκοπα;

Ενημερωτικα (απο εδω):
Το int ειναι 4 bytes και μετραει: -2,147,483,648 to 2,147,483,647
Το long long int ειναι 8 bytes και μετραει: -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807

Μπορει 8 bytes να μη φαινονται σημαντικα αν χρησιμοποιεις εναν int ή αν δουλευεις σε μικρο κομματι κωδικα που τρεχει μονο του, αλλα αν δουλευεις σε μεγαλυτερο project η μνημη (οπως και ο χρονος) ειναι πολυτιμη και περιορισμενη.

by (690 points)
0

Να προσθέσω ότι, εκτός από την άσκοπη μνήμη, για εργασίες με πολλές επαναλαμβανόμενες πράξεις θα επιβάλεις στον compiler, αν χρησιμοποιήσει SIMD και κάνει κάποιο auto vectorization, να έχει το μισό throughput.

+3 votes

Για να δώσω κι εγώ την απάντησή μου (η οποία περιέχει αρκετά μεγάλη δόση προσωπικών απόψεων και ίσως να ξεφεύγει ελαφρώς από το επίπεδο της σχολής):

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

Αν δεν έχεις χαλαρούς περιορισμούς στο πόσο μεγάλος θες να είναι ο ακέραιός σου, αλλά ξέρεις ότι θες να είναι π.χ. 64-bit (στην περίπτωση που μία εκφώνηση δίνει μέγιστο επιτρεπτό μέγεθος στα όρια του 64-bit...), το δηλώνεις ρητά, και αφήνεις την υλοποίηση της standard βιβλιοθήκης να βάλει αυτή τα long/long long/short/char όπου πρέπει:

#include <inttypes.h>

int main()
{
    uint64_t my_64_bit_unsigned;
    int16_t my_16_bit_signed;
    int my_int_i_dont_care_signed;
}

https://en.wikipedia.org/wiki/Inttypes.h

Με αυτό τον τρόπο δεν θα έχεις ποτέ πρόβλημα στυλ "στο δικό μου υπολογιστή παίζει αλλά στον Grader σκάει overflow" :)

Το γιατί int αντί για long long int θα το εκτιμήσεις όταν τα όρια μνήμης σου θα είναι στα 64MB και θα πρέπει να φτιάξεις πολυδιάστατους πίνακες :P

by (800 points)
0

Δείτε εδώ για το μέγεθος των αριθμών στη C++. Bottom line: Το standard της C++ πετάει το μπαλάκι στο standard της C το οποίο (§5.2.4.2.1) ορίζει ότι οι long long int είναι τουλάχιστον 64 bit. Άρα, για αλγοριθμάδες καλοί είναι... :-) Αν θέλετε να ξέρετε ακριβώς πόσα bits έχει ο αριθμός σας, να ακούτε τον @Soft Silverwind...

301 questions

289 answers

288 comments

899 users