PDA

Visualizza la versione completa : [C++] dimensioni delle variabili


Ippo343
24-07-2009, 02:11
Scusate, ma nei sistemi a 64 bit le variabili non dovrebbero avere una dimensione "doppia" rispetto ai sistemi a 32 bit?

Cioè, per un int 8 byte invece che 4, per uno short 4 byte invece che 2, un long 16 byte invece che 8 etc? O me lo sono sognato io?

Perchè io ho ubuntu a 64 bit, ma ho visto usando sizeof che le variabili hanno le dimensioni dei sistemi a 32 bit...

oregon
24-07-2009, 08:02
Stai usando un compilatore a 64 bit ?

Ippo343
24-07-2009, 12:43
A questo non avevo pensato. Uso gcc, che però è già incluso nell'installazione di ubuntu... non mi sono mai chiesto se fosse a 64 bit, immagino sia a 32.

oregon
24-07-2009, 13:08
Se e' a 32 bit, naturalmente, il suo int è a 32 bit ...

MItaly
24-07-2009, 14:28
Originariamente inviato da Ippo343
Scusate, ma nei sistemi a 64 bit le variabili non dovrebbero avere una dimensione "doppia" rispetto ai sistemi a 32 bit?
Non necessariamente. Per questioni di compatibilità alcuni compilatori (come Microsoft Visual C++) cambiano solo le dimensioni dei puntatori (che sono l'unica cosa che sicuramente cambia passando dai 32 ai 64 bit) e definiscono un nuovo tipo (di solito long long o qualcosa del genere) per gli interi a 64 bit.
Comunque g++ segue la politica per me più sensata, per cui mantiene i tipi fino all'int di dimensioni uguali, e cambia il long (che sulle piattaforme a 32 bit di solito è un intero a 32 bit uguale all'int normale) in un intero a 64 bit (8 byte). In questa maniera ottieni tutta la varietà di interi con i vari tipi forniti di default dal C++. Per verificare le dimensioni dei tipi comunque ho scritto un programmino estremamente semplice:


#include <iostream>

#define PRINT_TYPE_SIZE(type) std::cout<<#type<<" size: "<<sizeof(type)<<" bytes"<<std::endl

int main()
{
PRINT_TYPE_SIZE(void *);
PRINT_TYPE_SIZE(short);
PRINT_TYPE_SIZE(int);
PRINT_TYPE_SIZE(long);
PRINT_TYPE_SIZE(long long);
PRINT_TYPE_SIZE(float);
PRINT_TYPE_SIZE(double);
PRINT_TYPE_SIZE(long double);
PRINT_TYPE_SIZE(char);
PRINT_TYPE_SIZE(wchar_t);
return 0;
}
Sulla mia macchina


matteo@teoubuntu:~/cpp$ uname -a
Linux teoubuntu 2.6.28-14-generic #46-Ubuntu SMP Wed Jul 8 07:41:18 UTC 2009 x86_64 GNU/Linux
matteo@teoubuntu:~/cpp$ g++ --version
g++ (Ubuntu 4.3.3-5ubuntu4) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

compilato così


matteo@teoubuntu:~/cpp$ g++ dimensione\ tipi.cpp -O1 -O2 -O3 -Wall -o dimensione\ tipi

dà questi risultati:


matteo@teoubuntu:~/cpp$ ./dimensione\ tipi
void * size: 8 bytes
short size: 2 bytes
int size: 4 bytes
long size: 8 bytes
long long size: 8 bytes
float size: 4 bytes
double size: 8 bytes
long double size: 16 bytes
char size: 1 bytes
wchar_t size: 4 bytes
matteo@teoubuntu:~/cpp$

Loading