0

我正在扫描 pgSQL 的源代码,发现了一个有趣的宏。

#define SizeOfXLogRecord    (offsetof(XLogRecord, xl_crc) + sizeof(pg_crc32c))

的定义XLogRecord

typedef struct XLogRecord
{
    uint32      xl_tot_len;     /* total len of entire record */
    TransactionId xl_xid;       /* xact id */
    XLogRecPtr  xl_prev;        /* ptr to previous record in log */
    uint8       xl_info;        /* flag bits, see below */
    RmgrId      xl_rmid;        /* resource manager for this record */
    /* 2 bytes of padding here, initialize to zero */
    pg_crc32c   xl_crc;         /* CRC for this record */

    /* XLogRecordBlockHeaders and XLogRecordDataHeader follow, no padding */

} XLogRecord;

我很困惑为什么微使用offsetof最后一个成员和最后一个成员的总和sizeof来定义结构的大小?sizeof如果我直接使用结构会有什么不同吗?

顺便问一下, struct 的大小是XLogRecord多少?由于内存对齐,我认为它是 24 字节。但我从这里看到大小是 32 字节(这里是 pciture)。有人也可以解释一下吗?
更新:大小XLogRecord因版本而异。在最新版本中,这个大小正好是 24 字节。

任何帮助或信息将不胜感激。

代码摘自https://github.com/postgres/postgres/blob/4035cd5d4eee4dae797bfc77ab07f8dcd8781b41/src/include/access/xlogrecord.h

4

0 回答 0