От Alex B В стандарте C ++ не указывается размер интегральных типов в байтах, но он указывает минимальные диапазоны, которые они должны удержать. Вы можете вывести минимальный размер в битах из требуемого диапазона. Вы можете вывести минимальный размер в байтах из этого и значение макроса CHAR_BIT, определяющего количество бит в байте (во всех, кроме самых неясных платформ, это 8, и оно не может быть меньше 8).
Еще одно ограничение для char состоит в том, что его размер всегда 1 байт или бит CHAR_BIT (отсюда и название).
Минимальные диапазоны, требуемые стандартом (стр. 22):
и диапазоны типов данных в MSDN:
подписанный символ: от -127 до 127 (обратите внимание, не от -128 до 127, это соответствует платформам с добавлением 1). unsigned char: от 0 до 255 «простой» символ : От -127 до 127 или от 0 до 255 (зависит от знака по умолчанию): короткое: -32767 до 32767 без знака short: от 0 до 65535, подписанное int: -32767 до 32767 unsigned int: от 0 до 65535, подписанное длиной: -2147483647 до 2147483647 без знака длинный: от 0 до 4294967295 подписан длинный длинный: -9223372036854775807 до 9223372036854775807 unsigned long long: от 0 до 18446744073709551615 Реализация C ++ (или C) может определять размер типа в байтах sizeof (type) для любого значения, до тех пор, пока
выражение sizeof (type) * CHAR_BIT оценивает количество бит, достаточное для того, чтобы содержать требуемые диапазоны, и упорядочение типа остается в силе (например, sizeof (int) & lt; = sizeof (long)). Фактические диапазоны конкретных реализаций можно найти в заголовке на C или в C ++ (или даже лучше, в шаблоне std :: numeric_limits в заголовке).
Например, таким образом вы найдете максимальный диапазон для int:
C:
#include
const int min_int = INT_MIN;
const int max_int = INT_MAX;
C ++:
#include
const int min_int = std::numeric_limits::min();
const int max_int = std::numeric_limits::max();
Это правильно, однако вы также были правы в том, что: char: 1 byte short: 2 байта int: 4 байта: 4 байта float: 4 байта double: 8 байт
Поскольку 32-битные архитектуры по-прежнему по умолчанию и наиболее часто используются, и они сохранили эти стандартные размеры, поскольку pre -32-битные дни, когда память была менее доступной, а для обратной совместимости и стандартизации она осталась прежней. Даже 64-битные системы имеют тенденцию использовать их и имеют расширения / модификации. Пожалуйста, обратитесь к этому для получения дополнительной информации:
Если Ваши изменения сделаны к объектной модели SharePoint, можно использовать то, что изменения не фиксируются, пока Вы не звоните Update()
метод измененного объекта, такой как SPList.Update()
или SPWeb.Update()
.
Иначе я использовал бы Шаблон разработки Команды. Глава 6 в Главных Первых Шаблонах разработки даже имеет пример, который реализует функциональность отмены.
Шаблон "команда" GoF поддерживает невозможные операции.
Я думаю, что тот же шаблон может использоваться для последовательных операций (последовательные команды).
Рядом с Шаблоном "команда" GOF Вы могли бы также хотеть взглянуть на шаблон Сценария Транзакции от P EAA.
Необходимо, вероятно, создать Составную Команду (или Сценарий Транзакции), который выполняется в последовательности.
Вы могли бы хотеть взглянуть на Компенсацию Менеджера ресурсов:
http://msdn.microsoft.com/en-us/library/8xkdw05k (По сравнению с 80) .aspx
Иначе для отката/отмены Шаблон "memento". Это обычно используется, чтобы взять снимок объекта в установленный срок и позволить объектному состоянию, которое вернется к сувениру.
При использовании C++ (или любой другой язык с детерминированным выполнением деструктора, когда объемы заканчиваются), можно смотреть на гвардию Объема. Эта техника может, вероятно, также быть адаптирована к.NET, заставив ScopeGuard реализовать IDisposable и опрыснув "использование" операторов по мере необходимости.