Ну, во-первых, у вас не должно быть такой большой структуры. Если вы не очень осторожны в использовании структуры, она будет медленнее, чем использование класса. Кроме того, он противоречит интуитивно понятной семантике значений структур.
Тем не менее, барьер памяти будет гарантировать, что структура будет скопирована. Оптимизация не будет перемещать какие-либо инструкции через барьер.
Ключевое слово volatile немного отличается. Это гарантирует, что никакие операции с переменной не оптимизируются, и это гарантирует порядок обращений к памяти. Однако для типов данных, к которым нельзя получить атомарный доступ, в большинстве случаев это бесполезно для многопоточности, поскольку вы все равно можете прочитать половину нового значения и половину старого значения.