Выравнивание вектора векторов в шаблонном типе C ++C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Выравнивание вектора векторов в шаблонном типе C ++

Сообщение Anonymous »

В C ++, какой кратчайший способ объявить вектор векторов, где каждый внутренний std :: vector поля метаданных (важный размер и указатель) имеют выравнивание пользователя? PrettyPrint-Override ">

Код: Выделить всё

vector< alignas(64) vector > my_vector;
// or
vector< alignas(std::hardware_destructive_interference_size) vector > my_vector;
Но это не является действительным синтаксисом для размещения Alignas ключевого слова. /> Я нашел некоторые намеки на подходы в потоке Reddit «Идиоматический способ избежать ложного обмена», но шаблон все еще выглядит довольно большим. < /p>
Потребность в API внедрения < /h2>
Простой способ может быть чем-то вроде < /p>
template
struct AlignedObject {
alignas(Alignment) T object;
};

but this adds extra wrapping (requiring access through .object).
I'm looking to declare just the alignment, without having to change the interface through which my_vector needs to be accessed, so that the solution is a proper API-compatible drop-in replacement for vector with the same constructors, methods, Поведение, будущая защита (когда std :: vector может быть изменена в будущем) и т. Д. Чрезвычайно часто имеет параллелизированный цикл, где каждая итерация цикла записывает свой собственный выходной вектор , поэтому необходим вектор . Но потому что поля размера векторов находятся рядом друг с другом (вписываются в одну и ту же линию кэша), ложное совместное использование триггеры и, например, push_back () из одного потока замедляет то, что другой поток. Это объясняется, например, В выступлении «быстрее, чем memcpy».

Изменить: альтернативное решение этой подпрофса с помощью std :: move ()

Комментатор Loki Astari указывает ниже, что в большинстве случаев это может решать STD: Поля метаданных, спланированные с помощью стека, на которых могут быть выполнены быстрые обновления (например, изменение размера (например, изменение размера ( pointer) через .push_back () ) без запуска ложного обмена. Но этот вопрос по -прежнему полезен для ситуаций, когда это не желательно. На Godbolt.org, использование внешнего массива вместо вектора может быть полезно для быстрого проверки вовлеченных выравниваний, например,: написаноstd::array< std::vector , 10> my_vector;
std::array< /* insert solution approach here */, 10> my_vector;
< /code>
Связанные вопросы < /h2>

Использование выравниваний в шаблоне аргумента STD :: Vector

-почти те же вопросы, что и я, но вопрос был неправильным, так как спрашитель на самом деле не намеревался, чтобы выровнять индивидуальные элементы, так, что это было неправильно, так как это было неправильно. /> < /ul>
< /li>
< /ul>
Спасибо! < /p>

Подробнее здесь: https://stackoverflow.com/questions/796 ... lated-type
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»