在C标准库的klibc
实现中。 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个字节。我怀疑它是出于内存对齐的目的,但我不确定。即使它是,为什么需要呢?