почему размер экземпляра структуры FILE составляет 216 байтов в 64-битной ОС и 148 байтов в 32-битной ОС? - PullRequest
0 голосов
/ 26 ноября 2018

Если я печатаю размер экземпляра FILE или FILE, то получим 216 байт в 64-битной системе и 148 байт в 32-битной системе (ОС: Ubuntu 16.04, компиляция: GCC)

 printf("size : %zu",sizeof(FILE)); 

ИЛИ

FILE *fp;
printf("size : %zu",sizeof(*fp));

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

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Содержимое и размер структуры FILE полностью зависят от реализации.в вашей 64-битной версии она составляет 216 байт, а в 32-битной - 148 байт.Разница может быть связана с различием размеров некоторых членов этой структуры между 32-битным и 64-битным режимами: указатели больше, а также size_t и позиции файлов, это действительно зависит от того, как библиотека C обрабатываетстандартные потоки.

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

Обратите внимание, чтоFILE также может быть неполным типом: typedef для указателя на структуру, определение которой отсутствует, и в этом случае sizeof(FILE) приведет к ошибке компиляции.Основная причина поместить определение в заголовок <stdio.h> - позволить макросам получать прямой доступ к членам.Загляните в файл <stdio.h> и найдите другие реализации с открытым исходным кодом, такие как newlib или glibc.

Кроме того, стандарт C не требует, чтобы FILE был typedef дляструктура: это может быть не структура, она может быть определена как int.

0 голосов
/ 26 ноября 2018

результаты составляют 216 байт в 64-битной системе и 148 байт в 32-битной системе

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

Содержимое структуры FILE зависит от реализации (это означает, что они различаются на разных платформах).

В 32-разрядной системе размер указателя обычно равен4 байта и в 64-битной системе размер указателя обычно составляет 8 байтов.

Таким образом, разница в размере, который вы видите (216 - 148 = 68), может быть легко учтена.(Из того, что я помню, эта структура имеет около 15 указателей в Ubuntu GCC).Кроме указателей, размеры других типов, таких как int, long (которые могут быть частью структуры FILE) и т. Д., Могут отличаться от 32- и 64-битных систем.

Включая комментарии @MatteoItalia ниже:

В частности, используя это определение из glibc (и _IO_USE_OLD_IO_FILE undefined), я получаю 148 байтов (с 4-байтовыми int, указателями, size_t и __off_t).

Что касается разницы, существует более 17 указателей (плюс заполнение!), Которые будут учитывать разницу, но в конце есть также некоторое явное заполнение, которое усложняет вычисление (оно становится меньше в 64-битном, так как 15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t) - 40 на 32 бита, но 24 на 64 бита)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...