Търся подробна информация за размера на основните типове на C++. Знам, че това зависи от архитектурата (16 бита, 32 бита, 64 бита) и компилатора.
Но има ли някакви стандарти за C++?
Използвам Visual Studio 2008 на 32-битова архитектура. Ето какво получавам:
char : 1 byte
short : 2 bytes
int : 4 bytes
long : 4 bytes
float : 4 bytes
double: 8 bytes
Опитах се да намеря, без особен успех, надеждна информация за размерите на char
, short
, int
, long
, double
, float
(и други типове, за които не се сетих) при различни архитектури и компилатори.
На практика няма такова нещо. Често можете да очаквате, че std::size_t
ще представлява беззнаковия размер на естественото цяло число на текущата архитектура, т.е. 16-, 32- или 64-битова, но това не винаги е така, както се посочва в коментарите към този отговор.
Що се отнася до всички останали вградени типове, това наистина зависи от компилатора. Ето'два откъса, взети от текущия работен проект на последния стандарт C++:
Съществуват пет стандартни подписани целочислени типа: signed char, short int, int, long int и long long int. В този списък всеки тип осигурява поне толкова памет, колкото и предходните в списъка.
За всеки от стандартните знакови целочислени типове съществува съответен (но различен) стандартен беззнаков целочислен тип: unsigned char, unsigned short int, unsigned int, unsigned long int и unsigned long long int, всеки от които заема същото количество памет и има същите изисквания за подравняване.
Ако искате, можете статично (по време на компилация) да утвърдите размера на тези основни типове. Това ще предупреди хората да се замислят за пренасянето на кода ви, ако предположенията за sizeof се променят.
Както беше споменато, размерът трябва да отразява настоящата архитектура. Ако искате да видите как вашият компилатор се справя с нещата, можете да погледнете в limits.h
.
Както споменахте - това до голяма степен зависи от компилатора и платформата. За тази цел проверете стандарта ANSI, http://home.att.net/~jackklein/c/inttypes.html
Ето този за компилатора на Microsoft: Data Type Ranges.