[PATCH] D55045: Add a version of std::function that includes a few optimizations.

Louis Dionne via Phabricator reviews at reviews.llvm.org
Mon Dec 3 13:08:06 PST 2018

ldionne added a comment.

Eric and I just spoke. My point of view:

We should investigate factoring out the functions that differ in implementation into separate classes with a common API. This way, we could have something like this:

  template<class _Rp, class ..._ArgTypes>
  class function<_Rp(_ArgTypes...)> {
      typedef __function::__abi_v1_impl<_Rp(_ArgTypes...)> __implementation;
      typedef __function::__abi_optimized_impl<_Rp(_ArgTypes...)> __implementation;
      __implementation __impl_;

Then, in the copy constructor, something like:

  template<class _Rp, class ..._ArgTypes>
  function<_Rp(_ArgTypes...)>::function(const function& __f) {

And something analogous for other operations. This way, the implementation of each storage/dispatching mechanism would be collocated with itself and we could conceivably add new ones or introduce a new one in a future ABI version. There's also a possibility that we could reuse some of this logic (the SBO logic) in other components like `std::any`. We could also test those two implementations individually in some libc++-specific tests instead of leaving the new implementation go largely untested. I also think it would make the code cleaner than using `#ifdef`s all over the place, but that's subjective.

I'd like this avenue to be explored -- if it turns out not to be a fruitful approach, then I can live with the current approach.

  rCXX libc++



More information about the libcxx-commits mailing list