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

Oct 07, 2011 18:10


Кросспост из блога автора. Комментировать лучше там, но можно и тут

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


  1. class someShit{

  2.         char *m_sBuffer;

  3.         size_t m_iLimit;

  4.         size_t m_iCounter;

  5. };
то никто не может гарантировать, что где-то не написали:


  1.  m_sBuffer = (char*)&m_iCounter;
И тогда даже в одном треде можно огрести полные штаны счастья.
Меняю объявление на такое:


  1. class someShit{

  2.         char m_sBuffer[10240];

  3.         size_t m_iLimit;

  4.         size_t m_iCounter;

  5. };
И для интеловского компилятора получаю счастье, в данном примере в память лишний раз никто не лазит:


  1. void someShit::try1()

  2. {

  3.         m_iCounter = 0;

  4.         while (m_iCounter< m_iLimit && m_sBuffer[m_iCounter])

  5.                 m_iCounter++;

  6. }
MSVC 2010 это, правда, не помогло. Так и ходит через память.
Исходный вопрос (как отключить) снимается, restrict/__restrict в помощь, ключи компиляции опять-же есть.

С++, Программирование, intel

Previous post Next post
Up