在klibc
C标准库的实现中。该FILE
结构定义如下:
struct _IO_file {
int _IO_fileno; /* Underlying file descriptor */
_Bool _IO_eof; /* End of file flag */
_Bool _IO_error; /* Error flag */
};
typedef struct _IO_file FILE;
struct _IO_file_pvt {
struct _IO_file pub; /* Data exported to inlines */
struct _IO_file_pvt *prev, *next;
char *buf; /* Buffer */
char *data; /* Location of input data in buffer */
unsigned int ibytes; /* Input data bytes in buffer */
unsigned int obytes; /* Output data bytes in buffer */
unsigned int bufsiz; /* Total size of buffer */
enum _IO_bufmode bufmode; /* Type of buffering */
};
为此结构完成的分配:
struct _IO_file_pvt *f;
const size_t bufoffs =
(sizeof *f + 4*sizeof(void *) - 1) &
~(4*sizeof(void *) - 1);
f = zalloc(bufoffs + BUFSIZ + _IO_UNGET_SLOP);
BUFSIZ
16K和_IO_UNGET_SLOP
32在哪里。
该buf
字段指向结构本身之后的地址,这就是为什么在分配期间需要额外的BUFSIZ + _IO_UNGET_SLOP
地址。
我不明白为什么bufoffs
要这样定义。还sizeof *f
不够吗?
我在 32 位和 64 位机器上测试了这个表达式。sizeof *f
分别为 40 和 56 字节。bufoffs
是 48 和 64 字节。这意味着它在两种情况下都增加了 8 个字节。我怀疑这是出于内存对齐的目的,但我不确定。即使它是,为什么需要它?