Почему std :: atomic_ref не реализован в терминах std :: atomic - PullRequest
0 голосов
/ 18 ноября 2018

Ссылочная реализация std :: atomic_ref из статьи P0019r8 приблизительно сохраняет тип шаблона в качестве переменной-члена (https://github.com/ORNL/cpp-proposals-pub/blob/master/P0019/atomic_ref.hpp) и использует встроенные модули GNU для реализации атомарных операций.

Вопрос, который у меня здесь возникает, - почему бы не reinterpret_cast до std::atomic и использовать вместо этого атомарные операции?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Нет никакой гарантии, что std::atomic<T> не содержит ничего, кроме T, и имеет те же требования к размеру и выравниванию, что и T.Например, если sizeof(T) == 3, реализация std::atomic<T> может заполнить его до 4 байтов, чтобы разрешить использование встроенных функций.В другом примере, если sizeof(T) слишком велико для встроенной функции, std::atomic<T> может хранить некоторый примитив синхронизации для сериализации операции.

Следовательно, reinterpret_cast - std::atomic не являетсяжизнеспособная реализация в общем случае, даже если вы игнорируете общее неопределенное поведение из-за нарушений объектной модели.

0 голосов
/ 18 ноября 2018

Переосмысление чего-либо в том, что оно не использует, затем его использование является неопределенным поведением.

...