Каков C++ 03 модели памяти для параллелизма?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

35
задан 14 revs, 6 users 29% 24 March 2014 в 17:49
поделиться

7 ответов

Модель памяти C++ является спецификацией того, когда и почему физическая память читается/пишется относительно кода C++.

До следующего стандарта C++, модель памяти C++ совпадает с C. В C++ 0x стандарт, надлежащая модель памяти для многопоточности, как ожидают, будет включена (см. здесь ), и это будет часть возможно следующего пересмотра стандарта C, C1X. Текущий является элементарным:

  • это только определяет поведение операций памяти, заметных текущей программой.
  • это ничего не говорит о параллельных доступах памяти, когда несколько процессов получают доступ к той же памяти (нет никакого понятия общей памяти или процессов).
  • это ничего не говорит о параллельных доступах памяти, когда несколько потоков получают доступ к той же памяти (нет никакого понятия потоков).
  • это не предлагает способа определить упорядочивание для доступов памяти (оптимизация компилятора включает вынесение части текста программы, и недавние процессоры переупорядочивают доступы, оба могут повредить шаблоны, такие как проверенная дважды инициализация).

Так, текущее состояние: операции памяти C++ только определяются, когда Вы имеете 1 процесс, с его основным потоком и не пишете код, который зависит от определенного упорядочивания переменного чтения-записей и вот именно. В сущности это означает, что кроме традиционного привет мировая программа Вы завинчены.

, Конечно, Вы будете подсказкой, чтобы добавить, что "она работает сегодня над моей машиной, Вы не можете возможно быть правы" . Корректное предложение было бы , "оно работает сегодня над моей машиной с этой определенной комбинацией аппаратных средств, операционная система (библиотека потока) и компилятор, кто знает, что достаточно друг из друга реализует что-то, что является несколько рабочим, но вероятно повредится в какой-то момент" .

хорошо хорошо, это немного резко, но черт, даже Herb Sutter подтверждает, что (просто читает введение) и он говорит обо всех пред 2 007 версий одного из самого повсеместного набора инструментальных средств C/C++...

комитет по стандарту C++ пытается придумать что-то, что решит все те проблемы все еще будучи меньшим количеством ограничения (и таким образом лучшее выполнение), чем модель памяти Java.

Hans Boehm собрался здесь некоторые указатели на статьи о проблеме, и академической, и из комитета по C++.

33
ответ дан 9 revs, 4 users 81% 27 November 2019 в 07:15
поделиться

Наблюдение некоторых других ответов, кажется, что многие программисты на C++ даже не знают, что "модель памяти" Вы спрашиваете о средствах.

вопросы о модели памяти в смысле: что гарантии (если таковые имеются) там о записи / переупорядочение чтения (который может произойти на стороне компилятора или на стороне во время выполнения)? Этот вопрос очень важен для многопоточного программирования, как без таких правил, пишущий, что корректные программы мультипотока не возможны, и несколько удивительная истина является с текущим отсутствием явной модели памяти многой многопоточной работой программ более или менее "чистой удачей" - чаще всего благодаря компиляторам, принимающим искажение указателя через вызовы функции. - видят , Потоки не Могут быть Реализованы как Библиотека

В текущем C++ нет никакой стандартной модели памяти. Некоторые компиляторы определяют модель памяти для энергозависимых переменных, но это нестандартно. C++ 0x определяет новые "атомарные" примитивы с этой целью. Исчерпывающая начальная точка для проверки, что недавнее состояние, может быть найдена в Потоки и модель памяти для C++

, Важные ссылки также модель памяти Параллелизма , Атомарное Упорядочивание Зависимости по данным C++ Типов и : Атомная энергетика и Модель памяти стандартные предложения.

23
ответ дан 5 revs 27 November 2019 в 07:15
поделиться

К сожалению, в C++ нет никакой "Стандартной Модели памяти" как этот Java. Фактическую реализацию оставляют до компилятора, библиотек времени выполнения и процессоров.

Таким образом модель памяти C++ == хаотическое месиво соединения моделей, что означает Вас всегда, должно пытаться записать безопасный код, который не зависит от определенной модели памяти, и это идет для потокового программирования также, потому что компилятор может сделать любую оптимизацию, которую это хочет за пределами критического раздела, выровнять обработки заказов!

2
ответ дан Robert Gould 27 November 2019 в 07:15
поделиться

Что относительно того, чтобы проверить статьи о веб-сайте комитета по стандарту C++:

?

2
ответ дан Luc Hermitte 27 November 2019 в 07:15
поделиться

Короткий ответ: нет ни одного

ответ Long: C++ не имеет управляемой памяти, необходимо выделить его и освободить его сами. Классы интеллектуального указателя могут сделать это менее обременительным. Если Вы забываете к свободной памяти, что выделили, это - утечка памяти и ошибка. При попытке использовать память после освобождения его, или Вы пробуете к свободной памяти несколько раз, те - также противные ошибки.

Что касается деталей низкого уровня, C++ не определяет, что - это до аппаратных средств. К памяти получают доступ через указатели, которые содержат своего рода адрес памяти. Адреса памяти могут или быть физическими адресами или виртуальными адресами. Вы будете только видеть физические адреса, если Вы будете работать над ядром операционной системы, или если Вы читаете старый код DOS, который работал в реальном режиме. Для получения дополнительной информации читайте виртуальная память , существует много хороших ресурсов там.

x86 архитектура также позволяет памяти быть обращенной с помощью дескрипторов сегмента. Это - целая nother куча проблем, которая действительно не использовалась со дней Win16, и если Вы удачливы, Вы никогда не должны будете иметь дело с нею.

-1
ответ дан Adam Rosenfield 27 November 2019 в 07:15
поделиться

Короче говоря модель памяти C++ состоит из...

  • стопка А, которая становится нисходящей - то есть, при продвижении стекового фрейма указатель вершины стека имеет значение меньше, что это было

  • "куча" А, которая становится восходящей, который является конечным адресом недавно выделенной памяти, больше, что это было перед памятью. Вы выделяете память в "куче" с помощью malloc () или новый. Если существует недостаточно памяти, доступной в "куче" тогда malloc (или новый) называет кирпич системной функции () sbrk () для увеличения размера "кучи". Если вызов к кирпичу () или sbrk () перестал работать тогда malloc или новые сбои с из исключения памяти.

Вы никогда не должны должны быть заботиться, углубляются ли стек или "куча" или и в некоторых системах они могут работать наоборот. Просто полагайте, что стек и "куча" растут внутрь от концов адресного пространства.

  • средство выделения памяти А, malloc, который выделяет память с точки зрения 8-разрядных байтов. Новый также выделяет память, но объем памяти, который она выделяет, основан на размере объекта, являющегося newed.

  • Текстовое пространство, которое содержит исполняемый код. Текст находится ниже "кучи". Вы не можете изменить текстовое пространство во время выполнения

, программа А может иметь другие разделы особого назначения ниже текста.

Вы видите, как программа организована статически (прежде чем она будет загружена), использующий objdump в системах Linux.

я заметил, что, хотя Вы не упоминали его в своем вопросе, "параллелизм" является одним из ключевых слов, которые Вы присвоили этому вопросу. Поточная обработка систем allcoate дополнительное пространство потока на "куче" для каждого потока и затем управляет указателем вершины стека для переключения между потоками.

существует намного больше деталей, многие из которых характерны для конкретных аппаратных средств, Ose или системы поточной обработки, но это - основная идея.

-8
ответ дан mxg 27 November 2019 в 07:15
поделиться

Если вы хотите глубже понять модели согласованности разделяемой памяти, я бы направил вас к следующему учебнику.

http://rsim.cs.uiuc.edu/~sadve/Publications/computer96.pdf

1
ответ дан 27 November 2019 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: