Модель памяти C ++ - это спецификация того, когда и почему физическая память считывается / записывается относительно кода C ++.
До следующего стандарта C ++ модель памяти C ++ такая же, как и в C. В стандарте C ++ 0x ожидается включение подходящей модели памяти для многопоточности (см. здесь ), и возможно, он станет частью следующего пересмотра стандарта C, C1X. Текущий элементарен:
- указывает только поведение операций с памятью, наблюдаемых текущей программой.
- в нем ничего не говорится о одновременных обращениях к памяти, когда несколько процессов обращаются к одной и той же памяти (отсутствует понятие общей памяти или процессов).
- он ничего не говорит о одновременных обращениях к памяти, когда несколько потоков обращаются к одной и той же памяти (понятия о потоках отсутствуют).
- он не предлагает способа указания порядка доступа к памяти (оптимизация компилятора включает перемещение кода и недавние обращения к процессорам с переупорядочением, оба могут нарушить шаблоны, такие как инициализация с двойной проверкой).
Итак, текущее состояние: Операции с памятью C ++ указываются только тогда, когда у вас есть 1 процесс с его основным потоком и не пишущий код, который зависит от определенного порядка чтения / записи переменных, и все. По сути, это означает, что помимо традиционной программы hello world вы облажались.
Конечно, вам будет предложено добавить, что "это работает сегодня на моей машине, вы не можете быть правы" . Правильное предложение было бы "сегодня оно работает на моей машине с этой конкретной комбинацией аппаратного обеспечения, операционной системы (библиотеки потоков) и компилятора, которые достаточно хорошо знают друг друга, чтобы реализовать что-то, что несколько работает, но, вероятно, в какой-то момент сломается «.
Хорошо, хорошо, это немного грубо, но, черт возьми, даже Херб Саттер признает, что (только что прочитал вступление), и он говорит обо всех версиях одного из самых распространенных наборов инструментов C / C ++ до 2007 года ...
Стандартный комитет C ++ пытается придумать что-то, что решит все эти проблемы, но при этом будет менее ограниченным (и, следовательно, более эффективным), чем модель памяти Java.
Ханс Бём собрал здесь некоторые ссылки на статьи по этому вопросу, как академические, так и из комитета C ++.