Сложите выражения максимальное количество элементов в пакете расширения - PullRequest
2 голосов
/ 02 июня 2019

Пожалуйста, рассмотрите следующую программу:

#include <iostream>
#include <algorithm>

template<typename T, std::size_t N, std::size_t... I>
T sum_impl(T (&a)[N], std::index_sequence<I...>)
{
  return (a[I] + ...);
}

template<typename T, std::size_t N>
T sum(T (&a)[N])
{
  return sum_impl(a, std::make_index_sequence<N>{});
}

int main()
{
    int a[512] = {[0 ... 511] = 1};
    std::cout << "Sum =" << sum(a) << std::endl;
}

Демо

В случаях, как указано выше, выражения сгиба являются ИМХО хорошим способом раскрыть то, что в противном случае было бы циклом for. Естественно возникают следующие вопросы:

  1. Существует ли максимальное количество элементов в пакете расширения выражения сгиба для каждого поставщика и как мы можем получить / получить доступ к этому номеру (например, в VC ++ 2017 по какой-то причине максимальное число равно 745, в противном случае программа не не компилируется)?
  2. Есть ли в пакете расширения несколько элементов выражения сгиба, которые при превышении производительности снижаются. То есть, есть ли эмпирическое правило, что, если это число будет превышено, было бы лучше, если бы мы использовали цикл for?

1 Ответ

5 голосов
/ 02 июня 2019

Спецификация выражения сгиба в спецификации C ++ начинается следующим образом:

8.1.6 Выражения сгиба [expr.prim.fold]

Выражение сгиба выполняет сгибпакета параметров шаблона (17.5.3) через бинарный оператор ...

Это продолжается для пары параграфов.Ничто в них не устанавливает минимальный или максимальный размер выражения свертки, которое должен поддерживать компилятор C ++.Это не определено в этом разделе стандарта C ++;так что это полностью зависит от индивидуальной реализации C ++.Не существует определенных средств для определения ограничений конкретного компилятора.Вы обнаружили, что ваш конкретный компилятор ограничивает выражение сгиба до 745 значений.Причина этого ограничения, очевидно, связана с деталями внутренней реализации вашего компилятора;и не будучи знакомыми с ними, на самом деле не так много можно сказать об этом.Ограничения других компиляторов могут быть меньше или больше или ограничиваться только объемом доступной памяти.

PS.Что касается ссылки на спецификацию для пакета параметров шаблона, то эта часть стандарта C ++ не определяет минимальный / максимальный размер пакета параметров, который должен поддерживать компилятор C ++.

РЕДАКТИРОВАТЬ: было отмечено, чтоПриложение B перечисляет некоторые рекомендации, но не определяет их как абсолютные требования;и явно не вызывает максимальные пределы выражения сгиба.

Однако в Приложении B действительно вызываются:

Аргументы шаблона в объявлении шаблона [1 024].

Можно утверждать, что, если это использование «аргументов» включает аргументы в пакете параметров, это косвенно повлияет на выражения сгиба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...