Implement mj_stackAlloc and mj_arenaAlloc alignment using bitwise-and.

This implementation explicitly avoids calling division instructions (which are generally expensive) even when link-time optimization is not active or if the alloc functions aren't inlined for some reason.

Also make mj_stackAlloc cheaper for external callers who may be linking against MuJoCo dynamically (and therefore cannot benefit from inlining).

PiperOrigin-RevId: 561299565
Change-Id: Iea4be5bf6d351ddf0c9d1fd8bd89a0c207b39309
This commit is contained in:
Saran Tunyasuvunakool
2023-08-30 04:28:17 -07:00
committed by Copybara-Service
parent 4c899b92cc
commit 215433f5f7
5 changed files with 14 additions and 7 deletions
+2 -1
View File
@@ -188,7 +188,8 @@ MJAPI void mj_resetDataDebug(const mjModel* m, mjData* d, unsigned char debug_va
// Reset data, set fields from specified keyframe.
MJAPI void mj_resetDataKeyframe(const mjModel* m, mjData* d, int key);
// Allocate a specific number of bytes on mjData stack. Call mju_error on stack overflow.
// Allocate a number of bytes on mjData stack at a specific alignment which must be a power of 2.
// Call mju_error on stack overflow.
MJAPI void* mj_stackAlloc(mjData* d, size_t bytes, size_t alignment);
// Allocate array of mjtNums on mjData stack. Call mju_error on stack overflow.