You could use a STL allocator that would allow you to do the alignment, but the question is how do you get that to the vector. There is no way to pass an allocator to the current MixinVector so you are going to have to modify osg to try this. It would be nice if the new MixinVector class and all vectors that use it would allow for an allocator to be used on the underlying vector, but I guess there has never been a need for this yet.

Judd

David Spilling wrote:
Hi Gordon, Thibault,

Thanks for the replies regarding the contiguity of the memory in a std::vector. That at least solves half of the problem.



    Use &yourvector[0] to get a float* pointer to the beginning of the
array.

How do I define the vec4array so that &yourvector[0] is absolutely aligned, i.e. a multiple of (in my case) 16?

With a float array, on MS compilers, I would do __declspec(align(16)) float* myarray = new float[4 * MY_ARRAY_SIZE]. From what I understand, and from the MSDN documentation (http://msdn.microsoft.com/en-us/library/83ythb65.aspx) this is the correct way to guarantee this. #pragma pack 16 doesn't always do what you expect...

If I do __declspec(align(16)) Vec4Array* myarray = new Vec4Array, I'm guaranteed that "myarray" is 16 byte aligned, but what about the contents of the array? Especially if I do lots of ->push_back so that the std::vector resizes and goes somewhere else. Even if I do __declspec(align(16)) Vec4Array* myarary = new Vec4Array(MY_ARRAY_SIZE) I don't think I'm guaranteed 16 byte alignment of the first vector entry...

(I think the gcc equivalent to __declspec(align(X)) is __aligned__(X), by the way).

Regards,

David




_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to