Всегда ли sizeof (некоторый указатель) равен четырем? - PullRequest
210 голосов
/ 30 декабря 2008

Например: sizeof(char*) возвращает 4. Как и int*, long long*, все, что я пробовал. Есть ли исключения из этого?

Ответы [ 17 ]

3 голосов
/ 30 декабря 2008

Насколько я помню, это основано на размере адреса памяти. Таким образом, в системе с 32-битной адресной схемой sizeof вернет 4, поскольку это 4 байта.

3 голосов
/ 30 декабря 2008

Нет, размер указателя может варьироваться в зависимости от архитектуры. Есть множество исключений.

3 голосов
/ 30 декабря 2008

В общем случае sizeof (почти все) будет меняться при компиляции на разных платформах. На 32-битной платформе указатели всегда имеют одинаковый размер. На других платформах (64-битный является очевидным примером) это может измениться.

2 голосов
/ 08 июня 2018

В Win64 (Cygwin GCC 5.4) , давайте посмотрим на приведенный ниже пример:

Сначала проверьте следующую структуру:

struct list_node{
    int a;
    list_node* prev;
    list_node* next;
};

struct test_struc{
    char a, b;
};

Тестовый код ниже:

std::cout<<"sizeof(int):            "<<sizeof(int)<<std::endl;
std::cout<<"sizeof(int*):           "<<sizeof(int*)<<std::endl;
std::cout<<std::endl;

std::cout<<"sizeof(double):         "<<sizeof(double)<<std::endl;
std::cout<<"sizeof(double*):        "<<sizeof(double*)<<std::endl;
std::cout<<std::endl;

std::cout<<"sizeof(list_node):      "<<sizeof(list_node)<<std::endl;
std::cout<<"sizeof(list_node*):     "<<sizeof(list_node*)<<std::endl;
std::cout<<std::endl;

std::cout<<"sizeof(test_struc):     "<<sizeof(test_struc)<<std::endl;
std::cout<<"sizeof(test_struc*):    "<<sizeof(test_struc*)<<std::endl;    

Вывод ниже:

sizeof(int):            4
sizeof(int*):           8

sizeof(double):         8
sizeof(double*):        8

sizeof(list_node):      24
sizeof(list_node*):     8

sizeof(test_struc):     2
sizeof(test_struc*):    8

Вы можете видеть, что в 64-битном формате sizeof(pointer) равен 8.

1 голос
/ 30 декабря 2008

Причина, по которой размер вашего указателя составляет 4 байта, заключается в том, что вы компилируете для 32-битной архитектуры. Как отметил FryGuy, на 64-битной архитектуре вы увидите 8.

1 голос
/ 30 декабря 2008

Указатель - это просто контейнер для адреса. На 32-битной машине ваш диапазон адресов составляет 32 бита, поэтому указатель всегда будет 4 байта. На 64-битной машине, где у вас диапазон адресов 64 бита, указатель будет 8 байтов.

0 голосов
/ 20 августа 2016

Просто для полноты и исторического интереса в 64-битном мире существовали различные соглашения о платформе для размеров длинных и длинных длинных типов, называемых LLP64 и LP64, в основном между системами Unix-типа и Windows. Старый стандарт с именем ILP64 также сделал int = 64-битной шириной.

Microsoft поддерживает LLP64, где longlong = 64-битная ширина, но long остается на уровне 32, для упрощения переноса.

Type           ILP64   LP64   LLP64
char              8      8       8
short            16     16      16
int              64     32      32
long             64     64      32
long long        64     64      64
pointer          64     64      64

Источник: https://stackoverflow.com/a/384672/48026

...