2

klibcC标准库的实现中。该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);

BUFSIZ16K和_IO_UNGET_SLOP32在哪里。

buf字段指向结构本身之后的地址,这就是为什么在分配期间需要额外的BUFSIZ + _IO_UNGET_SLOP地址。

我不明白为什么bufoffs要这样定义。还sizeof *f不够吗?

我在 32 位和 64 位机器上测试了这个表达式。sizeof *f分别为 40 和 56 字节。bufoffs是 48 和 64 字节。这意味着它在两种情况下都增加了 8 个字节。我怀疑这是出于内存对齐的目的,但我不确定。即使它是,为什么需要它?

4

0 回答 0