我对boost::variant
的实现很好奇。
它是这样工作的吗?
两个成员:
- 表示当前存储类型的数字(即第一个模板参数为0,第二个模板参数为1等)
- 所有可能类型的联合体(当然是最大的大小)。
apply_visitor()
:
有一个基于当前存储类型数字的switch
语句,以调用正确的重载(这在最坏情况下将被编译为跳转表,因此需要常数时间)。
我知道还有一些优化措施可以确保boost::variant
不需要动态分配内存,详见此处,但我认为我已经理解了这些内容。
我对boost::variant
的实现很好奇。
它是这样工作的吗?
两个成员:
apply_visitor()
:
有一个基于当前存储类型数字的switch
语句,以调用正确的重载(这在最坏情况下将被编译为跳转表,因此需要常数时间)。
我知道还有一些优化措施可以确保boost::variant
不需要动态分配内存,详见此处,但我认为我已经理解了这些内容。
它有一个整数which
,用于指示使用哪种数据类型。
使用boost的aligned_storage
实现存储,它基本上是最大数据大小的缓冲区。(它在联合中,但出于对齐目的)
最后,访问者确实使用switch
实现,使用宏在编译时生成以展开所有类型可能性。