The primary constraints of where to put things on the C64 come from the video banking. Since the built-in font ROM is always visible to the video chip in 2 locations, the banking tends to be outside those if you're running custom graphics. Other than that, it comes to contiguous space for variable use, which is broken up a bit by the I/O page at $d000.
Probably the most handy tip is to parallelize arrays. So for instance if you have an array of 16-bit pointers and an 8-bit data point per entry, instead of trying to multiply by 3 to find offsets, use 3 separate tables for each of the entries:
Code:
ldx entryNum
lda tableLo,x
sta ptr
lda tableHi,x
sta ptr+1
lda tableData,x
jsr routine
; 256 entries in the table, each "entry" is effectively 3 bytes
tableLo: <256 bytes of space>
tableHi: <256 bytes of space>
tableData: <256 bytes of space>
The fastest and easiest is to use fixed-size, fixed location buffers for everything, ensuring 8-bit offsets are always used. Of course, this might not be as flexible as a full malloc-style heap, but shuffling around pointers & doing pointer math is not the 6502's strong suit anyway. If there is dynamic memory allocation, it's usually of the same type of structure out of a pool array.