There was also this paper: “You can have it all: abstraction and good cache performance” https://dl.acm.org/doi/10.1145/3133850.3133861… which talks abstracting over struct of arrays (SoA) vs array of structs (AoS) representations.
There was also a follow up paper by the same group which seemed interesting: “Reshape your layouts, not your programs: A safe language extension for better cache locality”
I've also wondered if somehow you could levitate data descriptions, and then map those to low level memory layouts - thinking of how Rust has different optimizations packing structs and tagged unions, for example. Would be cool if the user could have control over that.