上司のプロジェクトで次のコードを見つけました。
Dim strBuilder As New System.Text.StringBuilder("", 1000000)
彼に声をかける前に、この行が実際にその1つのstringbuilder用に1メガバイト(またはUnicodeでは2メガバイト?)のメモリを確保しているかどうかを確認したいと思います。
上司のプロジェクトで次のコードを見つけました。
Dim strBuilder As New System.Text.StringBuilder("", 1000000)
彼に声をかける前に、この行が実際にその1つのstringbuilder用に1メガバイト(またはUnicodeでは2メガバイト?)のメモリを確保しているかどうかを確認したいと思います。
Char()
これにより、長さ 1000000の a が初期化されます。
したがって、メモリに必要な実際のサイズは2000000 バイト= ~2 MB です。これは、char が Unicode であり、2 バイトが必要であるためです。
編集:上司が信じていない場合に備えて、これはILSpyに反映されています:
// System.Text.StringBuilder
[SecuritySafeCritical]
public unsafe StringBuilder(string value, int startIndex, int length, int capacity)
{
if (capacity < 0)
{
throw new ArgumentOutOfRangeException("capacity", Environment.GetResourceString("ArgumentOutOfRange_MustBePositive", new object[]
{
"capacity"
}));
}
if (length < 0)
{
throw new ArgumentOutOfRangeException("length", Environment.GetResourceString("ArgumentOutOfRange_MustBeNonNegNum", new object[]
{
"length"
}));
}
if (startIndex < 0)
{
throw new ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_StartIndex"));
}
if (value == null)
{
value = string.Empty;
}
if (startIndex > value.Length - length)
{
throw new ArgumentOutOfRangeException("length", Environment.GetResourceString("ArgumentOutOfRange_IndexLength"));
}
this.m_MaxCapacity = 2147483647;
if (capacity == 0)
{
capacity = 16;
}
if (capacity < length)
{
capacity = length;
}
this.m_ChunkChars = new char[capacity];
this.m_ChunkLength = length;
fixed (char* ptr = value)
{
StringBuilder.ThreadSafeCopy(ptr + (IntPtr)startIndex, this.m_ChunkChars, 0, length);
}
}
GC.GetTotalMemory()
その割り当ての前後に呼び出し て、増加するかどうかを確認できます。注: これはこれを行うための適切で科学的な方法ではありませんが、あなたの主張を証明するかもしれません。