Почему sizeof(int) отличается от sizeof (int*)?
мне интересно, почему в следующей программе sizeof(int)
возвращает другое значение, чем sizeof(int*)
.
вот небольшая программа:
int main(){
std::cout<<sizeof(int)<<endl;
std::cout<<sizeof(int*)<<endl;
return 0;
}
и вот результат:
4
8
до сих пор я помню, что размер целочисленного указателя-4byte(компилятор gcc). Как проверить правильный размер указателя? Это зависит от компьютера?
я запускаю ubuntu 12.04
# lsb_release -a
Distributor ID: Ubuntu
Description: Ubuntu 12.04 LTS
Release: 12.04
Codename: precise
размер указателя не является постоянным(стандартный размер) 8 байт.
4 ответов
размер int
и int*
полностью зависят от компилятора и оборудования. Если вы видите восемь байтов, используемых в int*
, у вас, вероятно, есть 64-разрядное оборудование, которое преобразуется в восемь байтов на указатель.
надеюсь, что это помогает!
sizeof(char) == 1
других гарантий (*) нет.
на практике указатели будут размером 2 в 16-битной системе, 4 в 32-битной системе и 8 в 64-битной системе.
( * ) См. комментарий Джеймса Канзе.
размер указателя зависит от системы, компилятора и архитектуры. В 32-разрядных системах это обычно 32 бита, в то время как в 64-разрядных системах это обычно 64 бита.
Если вы пытаетесь сохранить указатель в целое число для последующего восстановления в указатель снова, вы можете использовать тип intptr_t
который является интегральным типом, достаточно большим, чтобы удерживать (я считаю) нормальные (нефункциональные) типы указателей.
для 32-разрядных систем стандартом "de facto" является ILP32-то есть int, long и pointer - все 32-разрядные величины.
для 64-разрядных систем основным стандартом "de facto" Unix является LP64 - long и pointer-64-разрядные (но int-32-разрядные). 64-разрядная версия Windows стандарт LLP64-long long и указатель 64-бит (но long и int оба 32-бит).
в свое время некоторые системы Unix использовали организацию ILP64.
ни один из эти стандарты де-факто законодательно закреплены стандартом C (ISO / IEC 9899: 1999), но все разрешены им.
и
если вы относитесь с удобоносимостью, или вы хотите имя тип отражает размер, вы можете посмотреть заголовок, где доступны следующие макросы:
int8_t int16_t int32_t int64_t
int8_t
гарантированно будет 8 бит, иint16_t
гарантированно 16 биты, так далее.
посмотреть этот вопрос.