The compiler must not rearrange your m_tail and m_tail->next assignment such that m_tail is assigned with node before m_tail->next has been set. However, for a multi-threaded solution, you could have to worry about:
temp = m_tail;
m_tail = node;
temp->next = node;
node->next = NULL;
With a memory barrier, the compiler and/or the processor must complete the m_tail->next = node;
(and node->next = NULL;
) before it writes the m_tail = node;
. Whether this is sufficent to guarantee correct execution is not certain, it depends a bit on what the code reading at the other end does.