ericniebler / range-v3

Range library for C++14/17/20, basis for C++20's std::ranges
Other
4.06k stars 437 forks source link

Re-enable no_unique_address on GCC #1770

Closed morinmorin closed 1 year ago

morinmorin commented 1 year ago

ICE on GCC 10 prerelease has been fixed in GCC 10 release series.

brevzin commented 1 year ago

Cool, thanks for the catch! Confirmed that the test case in the issue seems to pass on every gcc I tried.

morinmorin commented 1 year ago

Thank you for merging! I tested to measure the size of some views in libstdc++ and libc++ (and range-v3). The tested code is here (slightly modified version of this code)

#define USE_RANGE_V3

#include <iostream>
#ifdef USE_RANGE_V3
#include <range/v3/core.hpp>
#include <range/v3/view.hpp>
#else
#include <ranges>
#endif

struct F
{
    bool operator()(int x) const { return x % 2 == 0; }
    int operator()(int x, int y) const { return x + y; }
};

int main()
{
#ifdef USE_RANGE_V3
    using namespace ranges::views;
#else
    using namespace std::ranges::views;
#endif

    int arr[3] = {4, 5, 6};

    std::cout << "arr | transform" << "\n";
    std::cout << sizeof(arr | transform(F{})) << "\n";

    std::cout << "arr | transform | transform" << "\n";
    std::cout << sizeof(arr | transform(F{}) | transform(F{})) << "\n";

    std::cout << "arr | transform | transform | transform" << "\n";
    std::cout << sizeof(arr | transform(F{}) | transform(F{}) | transform(F{})) << "\n";

    // std::cout << "transform (binary)" << "\n";
    // std::cout << sizeof(transform(arr, arr, F{})) << "\n";

    std::cout << "arr | take_while" << "\n";
    std::cout << sizeof(arr | take_while(F{})) << "\n";

    std::cout << "arr | drop_while" << "\n";
    std::cout << sizeof(arr | drop_while(F{})) << "\n";

    std::cout << "arr | filter" << "\n";
    std::cout << sizeof(arr | filter(F{})) << "\n";

    // std::cout << "arr | remove_if" << "\n";
    // std::cout << sizeof(arr | remove_if(F{})) << "\n";
}

Then, I noticed that views in range-v3 on GCC have strangely large size, which turned into this PR.

I also noticed that views' size in range-v3 is a bit larger than those of libstdc++ and libc++.

views libstdc++ libc++ range-v3
arr | transform 8 8 16
arr | transform | transform 16 16 24
arr | transform | transform | transform 24 24 32
arr | take_while 8 8 16
arr | drop_while 16 24 32
arr | filter 16 24 32