Нет. Нет никакого средства для выделения Объектов на стеке. Каждый Объект выделяется на "куче" и может пережить любой блок, в котором это было инициализировано. Или это может быть собранная середина блока, в зависимости от капризов всего могущественного Сборщика "мусора".
, Если Вы работаете над сервером, Вы могли бы хотеть проверить Java EE. Это не имеет никакого отношения к RAII, но это действительно имеет достойную систему для управления жизненными циклами дорогих объектов как соединения с БД. Java EE 5 на самом деле довольно хорош работать с для большого количества пространств задач.
Я не имею в виду конкретные примеры из реального мира, но «авторитет» - это стандарт C. Если что-то не требуется стандартом, вы можете создать соответствующую реализацию, которая намеренно не соответствует любым другим предположениям. Некоторые из этих предположений верны в большинстве случаев просто потому, что удобно реализовать указатель как целое число, представляющее адрес памяти, который может быть напрямую выбран процессором, но это просто следствие «удобства» и не может рассматриваться как универсальная истина.
sizeof (int *)
может быть не равным size (double *)
. void *
гарантированно может хранить любое значение указателя. sizeof (pointer_type)
дальше. Это можно легко сделать с помощью системы преобразования программ.
DMS Software Reengineering Toolkit - это система преобразования программ общего назначения, которая может использоваться со многими языками (C ++, COBOL, Java, EcmaScript, Fortran, ..), а также, в частности, с C #.
DMS анализирует исходный код, строит абстрактные синтаксические деревья и позволяет применять шаблоны от исходного кода к исходному для преобразования вашего кода из одна программа C # в другую с любыми свойствами. Правило преобразования для выполнения именно той задачи, которую вы указали:
domain CSharp.
insert_trace():method->method
"[Trace]
\visibility \returntype \methodname(string \parametername)
{ \body } "
->
"\visibility \returntype \methodname(string \parametername)
{ Log.Trace(\CSharpString\(\methodname\),
\CSharpString\(\parametername\),
\parametername);
\body } "
Кавычки (") не являются кавычками CSharp; скорее, они являются" кавычками домена "и указывают, что содержимое внутри кавычек соответствует синтаксису CSharp ( потому что мы сказали "домен CSharp"). Обозначения \ foo - это метасинтаксис.
Это правило сопоставляет AST, представляющий указанный вами метод с аннотацией [Trace], и переписывает этот AST в отслеживаемую форму. Затем полученный AST печатается обратно в исходную форму, которую вы можете скомпилировать. Возможно, вам понадобятся другие правила для обработки других комбинаций аргументов; Фактически, вы, вероятно, обобщили бы обработку аргументов, чтобы получить (где это возможно) строковое значение для каждого скалярного аргумента.
Должно быть ясно, что вы можете делать гораздо больше, чем просто ведение журнала, и гораздо больше, чем просто аспектно-ориентированное программирование, поскольку вы можете выражать произвольные преобразования, а не только действия до и после.
Затем полученный AST печатается обратно в исходную форму, которую вы можете скомпилировать. Возможно, вам понадобятся другие правила для обработки других комбинаций аргументов; Фактически, вы, вероятно, обобщили бы обработку аргументов, чтобы получить (где это возможно) строковое значение для каждого скалярного аргумента.Должно быть ясно, что вы можете делать гораздо больше, чем просто ведение журнала, и гораздо больше, чем просто аспектно-ориентированное программирование, поскольку вы можете выражать произвольные преобразования, а не только действия до и после.
Затем полученный AST печатается обратно в исходную форму, которую вы можете скомпилировать. Возможно, вам понадобятся другие правила для обработки других комбинаций аргументов; Фактически, вы, вероятно, обобщили бы обработку аргументов, чтобы получить (где это возможно) строковое значение для каждого скалярного аргумента.Должно быть ясно, что вы можете делать гораздо больше, чем просто ведение журнала, и гораздо больше, чем просто аспектно-ориентированное программирование, поскольку вы можете выражать произвольные преобразования, а не только действия до и после.