C++ 为什么添加view::filter会触发多个冗余sentinel检查?
给定的C++ 为什么添加view::filter会触发多个冗余sentinel检查?,c++,sentinel,range-v3,C++,Sentinel,Range V3,给定的str是一个字符串 auto str = std::string{}; getline(std::cin, str); 我注意到当我们有一个view::filter存在于一个惰性范围时,即使使用-O3,也会有许多冗余的哨兵检查。行政长官 使用-DNDEBUG,它可以产生更好的结果,但似乎还有一个多余的延迟 更新2 我尝试添加另一个变换。似乎在view::filter本身的后面只有一组冗余检查。行政长官 for(自动sv:str |范围::视图::定界('#')) //(1)此处的指针检
str
是一个字符串
auto str = std::string{};
getline(std::cin, str);
我注意到当我们有一个view::filter
存在于一个惰性范围时,即使使用-O3,也会有许多冗余的哨兵检查。行政长官
使用-DNDEBUG
,它可以产生更好的结果,但似乎还有一个多余的延迟
更新2 我尝试添加另一个变换。似乎在
view::filter
本身的后面只有一组冗余检查。行政长官
for(自动sv:str |范围::视图::定界('#'))
//(1)此处的指针检查和定界检查
|范围::视图::过滤器(仅限YALPHA)
//(2)此处还包括指针检查和定界检查
|范围::视图::转换(到整数)
|范围::视图::变换(到_ints2)){
std::coutstd::string\u视图(nullptr)
具有未定义的行为:您想要std::string\u视图()
。如果要分析程序集,可能需要使用-DNDEBUG
进行编译,以关闭range-v3中的调试检查。@Casey感谢您的指导。我修复了它并添加了一些更新。-DNDEBUG
帮助很大,但在进入转换之前仍有额外的检查。
for (auto sv : str | ranges::view::delimit('#')
// (1) pointer check and delimit check here
| ranges::view::filter(onlyalpha)
// (2) pointer check and delimit check here also!
| ranges::view::transform(to_ints) ) {
std::cout << sv;
// (3) pointer check and delimit check here too!
}
auto to_ints_with_filter = [](unsigned char ch){
if (std::isalpha(ch)) {
auto index = (ch - 1) & 0b0001'1111;
static constexpr auto table =
std::array<char,27> {
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
};
return std::string_view(&table[index],1);
}
else
return std::string_view();
};
for (auto sv : str | ranges::view::delimit('#')
| ranges::view::transform(to_ints_with_filter ) ) {
std::cout << sv;
}
for (auto sv : str | ranges::view::delimit('#')
// (1) pointer check and delimit check here
| ranges::view::filter(onlyalpha)
// (2) pointer check and delimit check here also
| ranges::view::transform(to_ints) ) {
std::cout << sv;
}
for (auto sv : str | ranges::view::delimit('#')
// (1) pointer check and delimit check here
| ranges::view::filter(onlyalpha)
// (2) pointer check and delimit check here also
| ranges::view::transform(to_ints)
| ranges::view::transform(to_ints2) ) {
std::cout << sv;
}