【发布时间】:2016-07-07 04:08:30
【问题描述】:
我正在从野牛的语义值构建我的解析数据结构。一种特殊的结构是std::vector<double> 类型。我很好奇野牛内部如何处理移动的语义值。我尝试分析c++.m4文件,发现:
template <typename Base>
inline
void
]b4_parser_class_name[::basic_symbol<Base>::move (basic_symbol& s)
{
super_type::move(s);
]b4_variant_if([b4_symbol_variant([this->type_get ()], [value], [move],
[s.value])],
[value = s.value;])[]b4_locations_if([
location = s.location;])[
}
不幸的是,我无法理解这一点,无法确定移动 std::vector 等数据结构的效率,部分原因是我对 m4 语法一无所知。
在我的语法中考虑到这一点:
%define api.token.constructor
%define api.value.type variant
%type < std::vector<double> > numlist
...
numlist:
num { $$ = std::vector<double>(); $$.push_back($1); }
| numlist "," num { $$ = $1; $$.push_back($3); }
;
我不确定性能影响。请注意,这将使用 C++98 编译器而不是 C++11 编译器进行编译;因此不会有移动语义。
我猜$$ = std::vector<double>() 语句可以被删除;我认为它已经是默认构造的,但我没有测试过,我不确定野牛的内部变体类型是如何工作的。我特别感兴趣的是$$ = $1; $$.push_back($3); 是否会为每个要添加的项目复制矢量?
我无法确定是否需要将类型切换为std::vector<double> *;诚然,使用 bison 的变体类型背后的大部分原因是使用纯 C++ 类型而不是指针联合。
我对实际上使用 C++11/14 尤其是 std::unique_ptr 的解析器也有类似的好奇心。如果分配了一行左递归规则,比如$$ = std::make_unique<...>(...),那么下面的代码是否能够执行$$ = $1; $$->...?
【问题讨论】:
标签: c++ vector c++14 bison move-semantics