О семантике C++ (продолжение)

Наши читатели подсказывают нам, что в рассмотренном ранее примере может быть алиасинг.

Действительно, если у нас такое вот:

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 в помощь, ключи компиляции опять-же есть.

Add new comment