Я хочу поддержать: < /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);
Подробнее здесь: https://stackoverflow.com/questions/797 ... clang-on-w
Мобильная версия