mirror of
https://github.com/microsoft/GSL.git
synced 2024-11-03 17:56:43 -05:00
9a7897915e
* rewrite span subspan checks to help optimizations * Removed checking pointer for null for subspans. We would never check pointer for null in between ptr and ptr+size in the original span, so there seems to be no reason to do so for subspans, provided that the subspan's boundaries are ensured to be within the range of the original span's boundaries. This change allows to simplify generated code, for example, to remove 5 out of 9 branches in code generated from the following by MSVC, and 4 out 8 branches in clang and gcc-generated code: span<int> mysubspan(int* p, std::ptrdiff_t size, std::ptrdiff_t i) { if (p != nullptr) { span<int> s = { p, size }; return s.subspan(i); } return { nullptr }; } Similar effects are achieved for dynamic subspans of static spans, where in the following code we remove 2 out of 4 branchs in MSVC and GCC-generated code: int test_dynamic_subspan_of_static_span(std::ptrdiff_t i) { int x[] = { 0,1,2,3,4,5 }; span<int, 6> s = { x }; auto subspan = s.subspan(i); return subspan.size(); } |
||
---|---|---|
.. | ||
gsl | ||
gsl_algorithm | ||
gsl_assert | ||
gsl_byte | ||
gsl_util | ||
multi_span | ||
pointers | ||
span | ||
string_span |