Я использую размещение new для создания объекта, который живет где-то в памяти (например, отображение ввода-вывода в памяти):
struct alignas(16) A
{
std::uint32_t m_i;
};
...
A* pA = new (memArena) A();
В моем коде потребителя у меня есть несколько веток на m_i
. Правильно ли я считаю, что он должен быть помечен как volatile
, иначе компилятор может сохранить его в регистре, и ветвь проверит этот регистр вместо значения, хранящегося в памяти?
На данный момент я не надену он не помечен как volatile
, но использует забор компилятора, такой как asm volatile("" : : "i,r,m"(m_i) : "memory");
, этого достаточно?
Меня интересует только x86, а не любая другая архитектура. Кроме того, есть один процесс, пишущий в эту область памяти, и другой, потребляющий, но мой вопрос не о проблемах параллелизма, а только о потенциальных ошибках, возникающих из-за оптимизаций моего компилятора.
Edit : исправлено размещение нового синтаксиса, изменено class на struct