【golang 技巧】通过提前下标访问,让编译器不要生成数据越界检查的代码(来自VictoriaLogs的未验证技巧)

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


阅读 VictoriaLogs 源码时,发现这样一段代码:

// lib/logstorage/log_rows.go
func (lr *logRows) mustAddRows(src *LogRows) {
	streamIDs := src.streamIDs
	timestamps := src.timestamps
	rows := src.rows

	if len(rows) == 0 {
		return
	}

	// a hint for the compiler for preventing from unnecessary bounds checks
	_ = streamIDs[len(rows)-1]
	_ = timestamps[len(rows)-1]

	for i := range rows {
		lr.mustAddRow(streamIDs[i], timestamps[i], rows[i])
	}
}

令人惊叹的代码是这一段:

	// a hint for the compiler for preventing from unnecessary bounds checks
	_ = streamIDs[len(rows)-1]
	_ = timestamps[len(rows)-1]

在循环之前,提前访问数组的最大边界,导致了循环内的数组下标访问,编译器就不会再生成边界检查代码

实在太酷了。
后续还需要验证一下这个技巧是否真的有效。

posted on 2025-06-02 15:01  ahfuzhang  阅读(31)  评论(0)    收藏  举报