Closed morinmorin closed 1 year ago
Cool, thanks for the catch! Confirmed that the test case in the issue seems to pass on every gcc I tried.
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 |
ICE on GCC 10 prerelease has been fixed in GCC 10 release series.