FixedAddressValueTypeAttribute コンストラクター
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
FixedAddressValueTypeAttribute クラスの新しいインスタンスを初期化します。
public:
FixedAddressValueTypeAttribute();
public FixedAddressValueTypeAttribute ();
Public Sub New ()
例
次の例では、 属性を使用して静的フィールドをメモリにピン留めする方法 FixedAddressValueTypeAttribute を示します。 構造体を Age
定義し、 型の静的フィールドを持つ 2 つのクラスを初期化します Age
。 2 番目のクラスは、フィールドのアドレスをピン留めするために適用されます FixedAddressValueTypeAttribute 。 これら 2 つのオブジェクトがインスタンス化される前と後に、多数のメモリ割り当てが行われ、ガベージ コレクターが呼び出されます。 この例の出力では、ガベージ コレクション後に最初 Age
のフィールドのアドレスが変更されましたが、適用先 FixedAddressValueTypeAttribute のフィールドのアドレスは変更されていないことが示されています。
using System;
using System.Runtime.CompilerServices;
public struct Age {
public int years;
public int months;
}
public class FreeClass
{
public static Age FreeAge;
public static unsafe IntPtr AddressOfFreeAge()
{
fixed (Age* pointer = &FreeAge)
{ return (IntPtr) pointer; }
}
}
public class FixedClass
{
[FixedAddressValueType]
public static Age FixedAge;
public static unsafe IntPtr AddressOfFixedAge()
{
fixed (Age* pointer = &FixedAge)
{ return (IntPtr) pointer; }
}
}
public class Example
{
public static void Main()
{
AllocateMemory();
// Get addresses of static Age fields.
IntPtr freePtr1 = FreeClass.AddressOfFreeAge();
AllocateMemory();
IntPtr fixedPtr1 = FixedClass.AddressOfFixedAge();
AllocateMemory();
// Garbage collection.
GC.Collect();
GC.WaitForPendingFinalizers();
// Get addresses of static Age fields after garbage collection.
IntPtr freePtr2 = FreeClass.AddressOfFreeAge();
IntPtr fixedPtr2 = FixedClass.AddressOfFixedAge();
// Display addresses before and after garbage collection
Console.WriteLine("Normal static: {0} -> {1}", freePtr1, freePtr2);
Console.WriteLine("Pinned static: {0} -> {1}", fixedPtr1, fixedPtr2);
}
// Allocate memory for 100,000 objects.
static public void AllocateMemory()
{
for (int ctr = 0; ctr <= 100000; ctr++)
{
object o = new object();
}
}
}
// The example displays output similar to the following:
// Normal static: 19932420 -> 19863704
// Pinned static: 19985508 -> 19985508
適用対象
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET