C / C ++: размер встроенных типов для различных компиляторов / платформ - PullRequest
1 голос
/ 22 сентября 2009

Где я могу получить информацию о размере, скажем, unsigned int компиляции в gcc для Mac OS X (32- и 64-битной версии)? В общем, я бы хотел, чтобы у меня был ресурс с компилятором / настройками / платформой / типом, и я мог бы посмотреть, насколько большим будет этот тип. Кто-нибудь знает о такой вещи?

Обновление: спасибо за все ответы. Я надеялся получить что-то более похожее на статическую таблицу, а не кусок кода, который мне пришлось бы писать и запускать на каждой машине.

Ответы [ 6 ]

9 голосов
/ 22 сентября 2009

Общий метод метода Самбоу (C ++):

#include <iostream>
#include <typeinfo>

template <typename T>
void print_sizeof(void)
{
    std::cout << "sizeof(" <<
        typeid(T).name() << ") == " <<
        sizeof(T) << std::endl;
}

int main(void)
{
    print_sizeof<short>();
    print_sizeof<unsigned int>();
    print_sizeof<long>();
    print_sizeof<long long>();
    print_sizeof<uint64_t>();
}

Обратите внимание, что компилятор не обязан давать вам фактическую строку для имени, но большинство делает.

7 голосов
/ 22 сентября 2009

Как правило, вам не нужно знать точные размеры, если вы включите stdint.h.Определено несколько очень полезных типов.

Если вы хотите точный размер, используйте их:

int8_t
uint8_t
int16_t
uint16_t
int32_t
uint32_t
int64_t
uint64_t

Если вы хотите хотя бы указанный размер, используйте эти:

int_least8_t
uint_least8_t
int_least16_t
uint_least16_t
int_least32_t
uint_least32_t
int_least64_t
uint_least64_t

Если вы хотите оптимизировать по крайней мере указанный размер для скорости, используйте эти:

int_fast8_t
uint_fast8_t
int_fast16_t
uint_fast16_t
int_fast32_t
uint_fast32_t
int_fast64_t
uint_fast64_t
6 голосов
/ 22 сентября 2009

Вы можете запросить длину типа данных с помощью оператора sizeof. Например:

#include <stdio.h> 
#include <inttypes.h> 

#define PRINT_SIZEOF(type)  printf("sizeof( " #type " ) == %zi\n", sizeof(type) )

int main(void){
  PRINT_SIZEOF( short        );
  PRINT_SIZEOF( unsigned int );
  PRINT_SIZEOF( long         );
  PRINT_SIZEOF( long long    );
  PRINT_SIZEOF( uint64_t     );
}

РЕДАКТИРОВАТЬ:% я изменился на% ZI

3 голосов
/ 22 сентября 2009

Если вы не можете написать программу для поиска, вам следует обратиться к спецификации ABI (Application Binary Interface) для компилятора / платформы. Он должен документировать размеры, выравнивания, порядковые номера и т. Д. Поддерживаемых основных типов примитивов.

2 голосов
/ 22 сентября 2009

Вы могли бы написать тестовую программу, которая использует вызовы sizeof для всех типов, которые вас интересуют. Также может быть полезно проверить ограничения.

0 голосов
/ 22 сентября 2009

вы, вероятно, могли бы написать какой-нибудь простой сценарий оболочки, который запрашивает тип, и когда вы вводите его, он компилирует что-то вроде того, что опубликовал sambowry, и выполняет его, чтобы сказать вам, какой у него размер ..

...