gsl::not_null 会影响性能吗?

问题描述

C++ Core Guidelines 推荐 gsl::not_null 类型。如I.12: Declare a pointer that must not be null as not_null中所述:

帮助避免取消引用 nullptr 错误。通过以下方式提高性能 避免对 nullptr 进行冗余检查。

...

通过陈述意图 源、实施者和工具可以提供更好的诊断,例如 通过静态分析发现某些类别的错误,并执行 优化,例如删除分支和空测试。

(如果有兴趣,这是微软对 gsl::not_null 的实现:GitHub

指南文档说它通过“删除分支和空测试”来帮助提高性能。但是,它也增加了开销,因为如果我想访问底层指针,将调用方法 operator->()operator*()(这不包括 Microsoft 实现在这方法中的运行时检查开销)。

鉴于无法保证方法内联,该文档如何得出净性能增益为正的结论?

解决方法

但是,它也增加了开销,因为方法 operator->() 和 operator*()

除了这些函数是内联定义的并且非常小,因此优化器(很可能)会内联扩展它们,这将完全消除潜在的开销。

该文档如何得出净性能增益为正的结论?

正如您所引用的,该文档甚至没有承认相关的开销,因此这样的结论是微不足道的。

如果您的意思是文档的作者是如何得出这样的结论的,那么只有这些作者知道。它的范围可能从“他们测量了它的影响”到“他们做了一个假设”。