Use the `SharedCache` concept introduced in D16204 to share lazily calculated evaluated data between original and multiple evaluated curves data-blocks. Combined with D14139, this should basically remove most costs associated with copying large curves data-blocks (though they add slightly higher constant overhead). The caches should interact well with undo steps, limiting recalculations on undo/redo. Options for avoiding the new overhead associated with the shared caches are described in T104327 and can be addressed separately. Simple situations affected by this change are using any of the following data on an evaluated curves data-block without first invalidating it: - Evaluated offsets (size of evaluated curves) - Evaluated positions - Evaluated tangents - Evaluated normals - Evaluated lengths (spline parameter node) - Internal Bezier and NURBS caches In a test with 4m points and 170k curves, using curve normals in a procedural setup that didn't change positions procedurally gave 5x faster playback speeds. Avoiding recalculating the offsets on every update saved about 3 ms for every sculpt update for brushes that don't change topology. Differential Revision: https://developer.blender.org/D17134