Неиспользуемая переменная в структуре FILE - PullRequest
4 голосов
/ 30 апреля 2020

Я смотрел на struct _IO_FILE:

struct _IO_FILE
{
  int _flags;       /* High-order word is _IO_MAGIC; rest is flags. */

  /* The following pointers correspond to the C++ streambuf protocol. */
  char *_IO_read_ptr;   /* Current read pointer */
  char *_IO_read_end;   /* End of get area. */
  char *_IO_read_base;  /* Start of putback+get area. */
  char *_IO_write_base; /* Start of put area. */
  char *_IO_write_ptr;  /* Current put pointer. */
  char *_IO_write_end;  /* End of put area. */
  char *_IO_buf_base;   /* Start of reserve area. */
  char *_IO_buf_end;    /* End of reserve area. */

  ...

  void *_freeres_buf;
  size_t __pad5;
  int _mode;
  /* Make sure we don't get into trouble again.  */
  char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)];
};

и заметил эту переменную char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)];

в чем смысл этой переменной? и что насчет этого комментария «Убедитесь, что у нас больше не будет проблем»?

1 Ответ

6 голосов
/ 30 апреля 2020

Это старый. Это поле было впервые добавлено с коммитом 1ea89a402d892b68b193e2e4390d8eb33ed686e7 13 октября 1997 года одним из разработчиков RedHat. Первоначально он был в файле libio / libioP.h. В это время был добавлен следующий код:

/* We had to extend _IO_FILE but this isn't easily possible without
   compatibility problems.  So we mimic the C++ way to do this which
   especially takes care that the position of the vtable stays the
   same.  */
struct _IO_FILE_complete
{
  struct _IO_FILE_plus plus;
  _IO_off64_t _offset;
  int _unused2[16]; /* Make sure we don't get into trouble again.  */
};

Таким образом, похоже, что это поле было изначально добавлено для обработки совместимости с C ++ относительно виртуальной таблицы.

Со временем размер и тип этого Поле было изменено, поскольку в эту структуру было добавлено больше полей, чтобы сохранить то же смещение Текущая версия этой структуры содержит одно дополнительное поле int, одно дополнительное поле size_t и четыре дополнительных поля указателя, которые учитывают разницу в размерах между исходной и текущей версией.

...