Наши читатели подсказывают нам, что в рассмотренном ранее примере может быть алиасинг.
Действительно, если у нас такое вот:
class someShit{
char *m_sBuffer;
size_t m_iLimit;
size_t m_iCounter;
};
то никто не может гарантировать, что где-то не написали:
m_sBuffer = (char*)&m_iCounter;
И тогда даже в одном треде можно огрести полные штаны счастья.
Меняю объявление на такое:
class someShit{
char m_sBuffer[10240];
size_t m_iLimit;
size_t m_iCounter;
};
И для интеловского компилятора получаю счастье, в данном примере в память лишний раз никто не лазит:
void someShit::try1()
{
m_iCounter = 0;
while (m_iCounter< m_iLimit && m_sBuffer[m_iCounter])
m_iCounter++;
}
MSVC 2010 это, правда, не помогло. Так и ходит через память.
Исходный вопрос (как отключить) снимается, restrict/__restrict в помощь, ключи компиляции опять-же есть.