Boost logo

Boost Users :

From: Marshall Clow (mclow.lists_at_[hidden])
Date: 2022-07-05 13:01:15


On Jul 5, 2022, at 1:29 AM, Dominique Pellé via Boost-users <boost-users_at_[hidden]> 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 list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net