Unity’s job system infrastructure has some limitations on what can alias within a job struct:
[NativeContainer]
(for example, NativeArray
and NativeSlice
) that are members of a job struct don’t alias.[NativeDisableContainerSafetyRestriction]
attribute can alias with other members. This is because this attribute explicitly opts in to this kind of aliasing.[NativeContainer]
can’t appear in other structs attributed with [NativeContainer]
. For example, you can’t have a NativeArray<NativeSlice<T>>
.The following example job shows how these limitations work in practice:
[BurstCompile]
private struct MyJob : IJob
{
public NativeArray<float> a;
public NativeArray<float> b;
public NativeSlice<int> c;
[NativeDisableContainerSafetyRestriction]
public NativeArray<byte> d;
public void Execute() { ... }
}
a
, b
, and c
don’t alias with each other.d
can alias with a
, b
, or c
.[!TIP] If you’re used to working with C/C++’s Type Based Alias Analysis (TBAA), then you might assume that because
d
has a different type froma
,b
, orc
, it shouldn’t alias. However, in C#, pointers don’t have any assumptions that pointing to a different type results in no aliasing. This is whyd
is assumed to alias witha
,b
, orc
.