функции.

ли кто-нибудь дать мне пример того, как я могу использовать сегментированные стеки с сопрограммами повышения? Нужно ли аннотировать каждую функцию, вызываемую из сопрограммы, специальнымsplit-stack атрибут?

Когда я пытаюсь написать программу, котораядолжен используйте сегментированные стеки, это просто segfaults.

Вот что я сделал до сих порhttps://wandbox.org/permlink/TltQwGpy4hRoHgDY Код, похоже, очень быстро пересекается, если бы использовались сегментированные стеки, я ожидал, что он сможет обрабатывать больше итераций. Программа выдает ошибки после 35 итераций.

#include <boost/coroutine2/all.hpp>

#include <iostream>
#include <array>

using std::cout;
using std::endl;

class Int {
    int a{2};
};

void foo(int num) {
    cout << "In iteration " << num << endl;
    std::array<Int, 1000> arr;
    static_cast<void>(arr);
    foo(num + 1);
}

int main() {
    using Coroutine_t = boost::coroutines2::coroutine<int>::push_type;
    auto coro = Coroutine_t{[&](auto& yield) {
        foo(yield.get());
    }};

    coro(0);
}
 TylerH18 сент. 2017 г., 21:08
Я не очень разбираюсь в C ++, но боюсь, если вы ищете реализации других, это делает этот вопрос слишком широким / в первую очередь основанным на мнении (например, "как бывы сделай это "). Если вы можете перефразировать свой вопрос, чтобы показать конкретную проблему / демонстрационный код с попыткой реализации, было бы легче дать ответ, который поможет решить проблему, с которой вы столкнулись.
 TylerH18 сент. 2017 г., 21:00
У вас есть проблемы с некоторыми аспектами использования сегментированных стеков с сопрограммами повышения или вы еще не написали попытку сделать это?
 Curious18 сент. 2017 г., 21:14
@TylerH опубликовал пример, этого достаточно?
 TylerH18 сент. 2017 г., 21:16
Спасибо; возможно, также измените заголовок вопроса, чтобы лучше описать проблему, с которой вы столкнулись? Например. «почему мой код сопрограммы так быстро пресекается» или что-то еще, чтобы лучше заметить людей, просматривающихC ++ вопросов.
 Curious18 сент. 2017 г., 21:02
@TylerH, когда я пытаюсь вызвать переполнение стека, это просто происходит, я не знаю, как использовать сегментированные стеки. Из прочтения документации здесьllvm.org/docs/SegmentedStacks.html кажется, что функции нуждаются в специальных аннотациях, чтобы их можно было рассматривать как «стеки», просто хотелось получить пример того, как другие люди достигли этого

Ответы на вопрос(2)

Географическая-стеки = на (включает специальный код внутри boost.coroutine и boost.context).

ваше приложение должно быть скомпилировано с-DBOOST_USE_SEGMENTED_STACKS а также-fsplit-stack (требуется заголовками boost.coroutines).

см документацию:http://www.boost.org/doc/libs/1_65_1/libs/coroutine/doc/html/coroutine/stack/segmented_stack_allocator.html

boost.coroutine содержит пример, демонстрирующий сегментированные стеки (в каталогесопрограмма / пример / асимметричная / вызовb2 toolset=gcc segmented-stacks=on).

пожалуйста, обратите внимание: пока llvm поддерживает сегментированные стеки, швы лягушки не обеспечивают__splitstack_<xyz> функции.

Решение Вопроса

-fsplit-stack решает проблему. Аннотации не требуются. Все функции по умолчанию рассматриваются как разделенные стеки. Пример -https://wandbox.org/permlink/Pzzj5gMoUAyU0h7Q

Легко как то.

Ваш ответ на вопрос