Планировка памяти приложения - PullRequest
1 голос
/ 09 сентября 2010

Следующий вопрос для меня - голова-царапина.Предполагая, что у меня есть две платформы с одинаковым оборудованием, одной и той же ОС и одним и тем же компилятором.Если я скомпилирую одно и то же приложение, могу ли я быть уверен, что расположение памяти на обеих машинах будет одинаковым?Другими словами, оба приложения имеют одно и то же виртуальное адресное пространство или высока вероятность того, что это не так.

Спасибо за ваши мысли об этом!

Ответы [ 5 ]

7 голосов
/ 09 сентября 2010

Вы не можете рассчитывать на это. В качестве функции безопасности некоторые ОС (включая Windows) в некоторой степени рандомизируют структуру памяти.

(Вот вспомогательная ссылка: http://blogs.msdn.com/b/winsdk/archive/2009/11/30/how-to-disable-address-space-layout-randomization-aslr.aspx)

1 голос
/ 09 сентября 2010

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

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

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

Из-за этих случаев и ситуаций, о которых упоминали другие люди, НЕ КОДИРУЙТЕ ПОСТОЯННОЕ РАСПОЛОЖЕНИЕ ПАМЯТИпринципы в вашу программу.Произойдут очень плохие вещи, особенно трудно отследить и отладить.

0 голосов
/ 09 сентября 2010

Возможно ли для них иметь одинаковую структуру памяти? Да, это возможно. вероятно ? Не совсем.

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

Это риторический или интеллектуальный вопрос, или это заставляет вас столкнуться с какой-то проблемой с программой, которую вы пишете?

0 голосов
/ 09 сентября 2010

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

В результате, в зависимости от скорости компиляции, ваши исполняемые файлы могут заканчиваться не только разными __TIME__ строками, но даже различным числом __TIME__.

Еслиработает поздно, вы можете увидеть то же самое с __DATE__ строк;)

0 голосов
/ 09 сентября 2010

Помимо динамического вопроса, такого как адреса стеков, как указывает Стивен, есть также аспект времени компиляции и статического размещения.

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

Я помню, что *У 1005 * были трудности на некоторых архитектурах с его автоматической сборкой, поскольку компилятор, созданный на этапе 2, отличался от компилятора на этапе 3 по таким глупым причинам.

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