Klibc:了解为_IO_file_pvt struct完成的内存分配

时间:2013-03-31 19:22:45

标签: c memory-management linux-kernel stdio libc

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

0 个答案:

没有答案