Spring также имеет загрузчик свойств. Мы используем этот метод для установки переменных, которые являются иждивенцем на среде (например, разработка, тестирование, принятие, производство...). Это могло быть, например, очередью для слушания.
, Если бы нет никакой причины, почему свойство изменилось бы, нет также никакой причины настроить его таким образом.
Я написал несколько тестовых проектов на C, чтобы попытаться понять это, - хотя Роб Кеннеди опередил меня в ответе, пока меня не было. Оба условия возможны, включая перекрестный процесс, как он подчеркивает. Вот ссылка, если кто-то еще хотел бы увидеть это в действии.
SharedFileTests.zip (VS2005 C ++ Solution) @ meklarian.com
Есть три проекта:
InProcessThreadShareTest - Тестирование создателя и клиентского потока.
InProcessThreadShareTest.cpp Snippet @ gist.github
SharedFileHost - создает хост, который работает в течение 1 минуты и обновляет файл.
SharedFileClient - создайте клиента, который работает в течение 30 секунд и опрашивает файл.
SharedFileHost.cpp и SharedFileClient.cpp Snippet @ gist.github
Все эти проекты предполагают расположение C: \ data \ tmp \ sharetest.txt можно создавать и записывать.
Судя по вашему сценарию, вам нужен очень большой кусок памяти. Вместо того, чтобы играть в системный кеш, вы можете использовать AWE для доступа к более чем 4 ГБ памяти, хотя вам нужно будет отображать части за раз. Это должно охватывать ваш сценарий L2, поскольку вы хотите убедиться, что используется физическая память.
Address Windowing Extensions @ MSDN
Используйте AllocateUserPhysicalPages и VirtualAlloc для резервирования памяти.
Функция AllocateUserPhysicalPages (Windows) @ MSDN
Функция VirtualAlloc (Windows) @ MSDN
Учитывая, что вы используете флаг FILE_FLAG_DELETE_ON_CLOSE, есть ли причина, по которой вы бы не стали использовать отображение памяти файл вместо этого?
Управление отображенными в память файлами в Win32 @ MSDN
Из того, что я вижу в ваших инструкциях CreateFile, похоже, что вы хотите обмениваться данными между потоками или между процессами, имея в виду только одинаковые файл присутствует, пока открыты все сеансы. Файл с отображением памяти позволяет использовать одно и то же логическое имя файла во всех сеансах. Еще одно преимущество заключается в том, что вы можете отображать представления и блокировать части сопоставленного файла с безопасностью во всех сеансах. Если у вас есть строгий сервер со сценарием с N-клиентом, это должно быть легко реализовать. Если у вас есть случай, когда любой клиент может быть открывающим сервером, Компилятору разрешено размещать отступы между членами, чтобы сделать доступ более эффективным (но не разрешено изменять порядок).
Как работает dynamic_cast <>
, является деталью реализации компилятора и не определено стандартом . Все будет зависеть от ABI, используемого компилятором.
reinterpret_cast <>
работает, просто изменяя тип объекта. Единственное, что вы можете гарантировать, это то, что приведение указателя к void * и обратно к тому же указателю на класс даст вам тот же указатель.
Ответ: «это сложно». Динамическое приведение не просто регулирует указатели со смещением; он может фактически извлекать внутренние указатели внутри объекта, чтобы выполнять свою работу. GCC следует за ABI, разработанным для Itanium, но реализованным более широко. Вы можете найти кровавые подробности здесь: Itanium C ++ ABI .
Как говорилось ранее, полная информация сложна, болезненна для чтения и действительно полезна только разработчикам компилятора и варьируется в зависимости от компилятора. По сути, каждый объект содержит следующее (обычно в этом порядке):
Эти фрагменты данных могут быть дополнены или не дополнены, чтобы упростить выравнивание памяти и т. д. Скрытая в среде выполнения информация о типе - это информация о типе, v-таблицы для виртуальных родительских классов и т. д., все это зависит от компилятора.
Когда дело доходит до приведения типов, reinterpret_cast
просто изменяет тип данных C ++ указателя и больше ничего не делает, так что вам лучше быть уверенным, что вы знаете, что делаете, когда используете его, иначе вы можете сильно испортить вещи. dynamic_cast
делает то же самое, что и static_cast (изменяя указатель), за исключением того, что он использует информацию о типе времени выполнения, чтобы выяснить, может ли он привести к данному типу и как это сделать. Опять же, все это зависит от компилятора. Обратите внимание, что вы не можете dynamic_cast
a void *
, потому что ему нужно знать, где найти информацию о типе среды выполнения, чтобы он мог выполнять все свои замечательные проверки во время выполнения.
dynamic_cast
делает то же самое, что и static_cast (при изменении указателя), за исключением того, что он использует информацию о типе времени выполнения, чтобы выяснить, может ли он привести к данному типу и как это сделать. Опять же, все это зависит от компилятора. Обратите внимание, что вы не можете dynamic_cast
a void *
, потому что ему нужно знать, где найти информацию о типе среды выполнения, чтобы он мог выполнять все свои замечательные проверки во время выполнения. dynamic_cast
делает то же самое, что и static_cast (изменяя указатель), за исключением того, что он использует информацию о типе времени выполнения, чтобы выяснить, может ли он привести к данному типу и как это сделать. Опять же, все это зависит от компилятора. Обратите внимание, что вы не можете dynamic_cast
a void *
, потому что ему нужно знать, где найти информацию о типе времени выполнения, чтобы он мог выполнять все свои замечательные проверки во время выполнения.