Как портильно использовать STD :: Atomic внутри объединения по всему платформам (MSVC/Clang в Windows/MacOS/Linux)?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как портильно использовать STD :: Atomic внутри объединения по всему платформам (MSVC/Clang в Windows/MacOS/Linux)?

Сообщение Anonymous »

Я работаю над кроссплатформенной структурой данных и пытаюсь определить компактную компоновку на основе союза, которая обеспечивает атомный доступ к 64-битному слову, а также привигаю к нижним 32-битным полям. < /p>
Я хочу поддержать: < /p>
  • msvc x64 и arm64 < /li>

    msvc x64 и arm64 < /br />
    msvc x64 и arm64 < /p>

    msvc x64 и arm64 < /p>

    msvc x64 и arm. Arm64
  • В Windows, MacOS и Linux
Что я хочу:
Я хотел бы определить структуру, подобную этой:

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

struct tTWUnion {
union {
std::atomic uValue;

struct {
std::atomic uID;
std::atomic uSwitchPointID;
};
};
};
< /code>
Затем используйте его как: < /p>
tTWUnion tun;
tun.uValue.store(100);               // or
tun.uID.store(42);
tun.uSwitchPointID.store(58);
< /code>
Но это не может компилироваться, потому что std :: atomic не является тривиальным, и размещение множества std :: atomic в союзе заставляет компилятор удалять конструктор по умолчанию (которого я хочу избежать вручную по причинам переносимости). < /p>
, если я хочу избежать: < /p>
< /p>
, если я хочу: < /p>
< /p>
.struct tTWUnion {
union {
std::atomic uValue;
struct {
uint32_t uID;
uint32_t uSwitchPointID;
};
};
};
< /code>
Тогда я могу скомпилировать его, но теперь только Uvalue является атомным - и доступ к UID или USWitchPointId, гарантиям атома, и может привести к разрыву или гонкам данных. затрудняет поддержание кода на всех платформах). < /li>
[*] Я не хочу полагаться на не определенное поведение или невозможно-газеты, но я также хочу избежать дублирующих данных, если это возможно. Такая компоновка объединения, в которой могут сосуществовать как полный 64-разрядный атомный доступ, так и частичные 32-разрядные атомные поля
  Почему именно устанавливает множественные std :: atomic внутри союза приводит к вопросам конструктора? Может разрешить это безопасно?struct tTWUnion {
union {
uint64_t uValue;
struct {
uint32_t uID;
uint32_t uSwitchPointID;
};
};
};
< /code>
, а затем используйте его как: < /p>
std::atomic atomicUnion;
tTWUnion value = {};
value.uValue = 100;
atomicUnion.store(value);
tTWUnion value2 = {};
value2.uID = 42;
value2.uSwitchPointID = 99;
atomicUnion.store(value2);
использует std :: atomic, как это действительное, если sizeof (ttwunion) == 8?

Подробнее здесь: https://stackoverflow.com/questions/797 ... clang-on-w
Ответить

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

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

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

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

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