private int CalculateSelfSize() { string str = Object as string; if (str != null) { // string needs special handling int strSize = 3 * IntPtr.Size + 2; strSize += str.Length * sizeof(char); int pad = strSize % IntPtr.Size; if (pad != 0) { strSize += IntPtr.Size - pad; } return(strSize); } if (Object.GetType().IsArray) { var elementType = Object.GetType().GetElementType(); if (elementType != null && (elementType.IsValueType || elementType.IsPrimitive || elementType.IsEnum)) { // no overhead for array return(0); } else { int arraySize = GetTotalArrayLength((Array)Object); return(IntPtr.Size * arraySize); } } return(TypeData.Get(Object.GetType()).Size); }
private void CrawlRoot([NotNull] CrawlItem root, [NotNull] CrawlSettings crawlSettings) { var queue = new Queue <CrawlItem>(); queue.Enqueue(root); while (queue.Count > 0) { var next = queue.Dequeue(); var type = next.Object.GetType(); var typeData = TypeData.Get(type); if (type.IsArray) { QueueArrayElements(next, queue, next.Object, crawlSettings); } if (type == typeof(GameObject)) { QueueHierarchy(next, queue, next.Object, crawlSettings); } if (typeData.DynamicSizedFields != null) { foreach (var field in typeData.DynamicSizedFields) { var v = field.GetValue(next.Object); QueueValue(next, queue, v, field.Name, crawlSettings); } } } root.UpdateSize(SizeMode); }