1.9 KiB
1.9 KiB
Aliasing and the job system
Unity's job system infrastructure has some limitations on what can alias within a job struct:
- Structs attributed with
[NativeContainer]
(for example,NativeArray
andNativeSlice
) that are members of a job struct don't alias. - Job struct members with the
[NativeDisableContainerSafetyRestriction]
attribute can alias with other members. This is because this attribute explicitly opts in to this kind of aliasing. - Pointers to structs attributed with
[NativeContainer]
can't appear in other structs attributed with[NativeContainer]
. For example, you can't have aNativeArray<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
, andc
don't alias with each other.d
can alias witha
,b
, orc
.
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
.