我正在扫描 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 字节。
任何帮助或信息将不胜感激。