On Fri, Aug 25, 2023, 10:08 AM Hewill Kang via Std-Proposals <std-proposals@lists.isocpp.org> wrote:

Hi all experts,

boost::compressed_pair is widely used as a replacement for std::pair in order to save storage when one of the data members is an empty class.

The __compressed_pair helper class, which is similar to boost::compressed_pair, is also widely used in libc++.

I wonder if we could get this compression optimization at almost no cost if add the C++ [[no_unique_address]] attribute to the members of std::pair:

namespace std {
  template<class T1, class T2>
  struct pair {
    using first_type  = T1;
    using second_type = T2;

    [[no_unique_address]] T1 first;  // <- here
    [[no_unique_address]] T2 second; // <- here

This looks reasonable to me, and almost achieves the equivalent of boost::compressed_pair.

What do you guys think about this? This seems like a great enhancement to me. Or does this kind of practice bring certain issues? 

Comments are very welcome.


Std-Proposals mailing list

std::pair and std: tuple aren't even trivially copyable when they could be due to ABI. This would be even worse.