On Jul 5, 2022, at 1:29 AM, Dominique Pellé via Boost-users <boost-users@lists.boost.org> wrote: > > Hi > > This following program shows many allocations coming > from boost::split(..., boost::is_any_of(",")): > ``` > $ cat split.cpp > > #include <string> > #include <cstdio> > #include <boost/algorithm/string.hpp> > #include <boost/container/small_vector.hpp> > > int main() { > std::string str = "foo,bar,foobar,quux"; > std::size_t s = 0; > for (int i = 0; i < 100; ++i) { > boost::container::small_vector<std::string, 4> v; > #ifdef USE_IS_ANY_OF > boost::split(v, str, boost::is_any_of(",")); > #else > boost::split(v, str, [](const char c) { return c == ',';}); > #endif > s += v.size(); > } > fprintf(stderr, "%zu\n", s); > } > ``` > When using boost::is_any_of(","), there are 7 dynamic allocations > per loop iteration whereas when using the lambda predicate, > there are 0 dynamic allocation per loop as shown below: > ``` > $ clang++ -std=c++14 -DUSE_IS_ANY_OF split.cpp > $ heaptrack ./a.out > ... > allocations: 702 > > $ clang++ -std=c++14 split.cpp > $ heaptrack ./a.out > ... > allocations: 2 > ```
What happens if you change your code to create the `boost::is_any_of` object outside the loop? — Marshall _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org https://lists.boost.org/mailman/listinfo.cgi/boost-users