The user has to allocate a vec4. Anyway you slice it, unnecessary vec4 instances are allocated. A vec4 is really just a container of 4 doubles.