Не знаю. Думал, что раз есть эти функции на WinAPI есть, то так проще. Тем более на asio больше как-то про сеть, а такого что-бы для для файлов было begin_read и wait (т.е. с очередью на 1 запрос к одному файлу, вполне достаточно) не нашёл.
Похоже, что дело во флаге FILE_FLAG_WRITE_THROUGH. Если его указать, то действительно запись идёт асинхронно. Но суммарно ощутимо больше. Размер буфера 2 Мбайта.
Если указывать еще FILE_FLAG_NO_BUFFERING, то нужно выравнивание на 512, и вообще почему-то у меня с этим флагом самая последняя порция не записывалась, поэтому отказался. Возможно без выравнивания (но с FILE_FLAG_WRITE_THROUGH) пишет в 2 прохода и от этого тормоза. . .
Необходимые файлы boostа скачали? Там в основном вся библиотека только на заголовочных файлах, не требующих предварительной компиляции для себя. Остаётся только обеспечить их видимость компилятору. Но есть несколько моментов, где кроме них потребуется статически / динамически линкуемый модуль.
Скорее всего здесь имелась в виду обработка последовательности с разнородными скобками: круглой, квадратной, фигурной и т.д. Тогда стек оправдан. Ввод даже можно не сохранять в строку, сделать input stream iterator из cin и посимвольно обрабатывать. До перевода коретки. Предварительно отключив флаг игнорирования пробелов (см. пространство std::ios)
Когда вызывается encoder, то он создаёт структуру на стеке из константых значений, т.е. записывает полученные на этапе комп. числа в стек. Как если объявить локально char s [] = "hello", если потом взять адрес data и сохранить, возможна ошибка - структура вроде бы обязана жить только до точки с запятой, или до конца блока, если объявлена как переменная. Если вызов и сохранение структуры было в глобальную пер., то эти данные лежат в секции данных, и можно брать и сохранять, передавать их адреса. Как если в локально объявить char *s = "hello". Может быть какая-то поиграть с параметрами шаблона и static. Вот например, вы указывали integral_constant, оно как раз имеет разный тип для разных значений. Что-то похожее имею в виду. Правда там map то требует типа именно wchar_t
Т.е. мы можем же написать просто encode < 4 > ( ... ).data ? Еще encoder не дописывает 0 в конце. Может в этом дело. Да, фактически constexpr int и const int отличаются тем, будет ли хранится значение в памяти в структуре при слабой оптимизации.
Возможно, дело вот в чем. Если бы не constexpr у функции она бы возвращала структуру на стеке. А для constexpr возможно должна формироваться как-бы структура в глобальной области... Возможно это делает макрос? Хотя может не прав, и не очень понятно выразился