c - Better to pass struct, or pointer to struct? -


i have data struct, read in function.

i want smallest memory, code size, , speed footprint possible. i'm working on avr.

typedef struct {     uint16_t clu;     uint16_t num;     uint32_t cur_rel; } fsavepos; 

now, function stores file position struct:

// approach 1 fsavepos save_pos(const ffile* file); // return value  // approach 2 void save_pos(const ffile* file, fsavepos* pos); // modify reference 

and function reverses (ffile object modified):

// approach 1 void restore_pos(ffile* file, const fsavepos pos); // pass value  // approach 2 void restore_pos(ffile* file, const fsavepos* pos); // pass reference 

what advise best idea?

if trying minimise memory footprint, struct type larger pointer better passed using pointer. data smaller better passed value. if pointer , data same size, doesn't matter much.

assuming on avr32, pointer 32-bit , struct 64-bit (plus padding).

that suggest better passing pointer/reference. however, struct not particularly large, other considerations may dominate - there not lot in struct type, not particularly large. need measure relevant quantities (memory usage, code size, speed, etc) sure.

so best idea, suggest, measure - these things affected host architecture, compiler settings, quality of implementation of compiler, etc.

although haven't asked, larger types (like uint32_t) tend have larger alignment requirements smaller types (like uint16_t). consequence of common guideline of ordering members of struct larger types appear first in memory. not significant in case either (it fair bet 16 bit type aligned 16 bit boundaries, , 32-bit types 32-bit boundaries, there no padding in case). however, if had 3 uint16_t members rather two, better off ordering things uint32_t members first. in other words, instead of

typedef struct {     uint16_t a,b,c;     uint32_t d; } some_type; 

you better off using different order.

typedef struct {     uint32_t d;     uint16_t a,b,c; } some_type; 

Comments

Popular posts from this blog

javascript - gulp-nodemon - nodejs restart after file change - Error: listen EADDRINUSE events.js:85 -

Fatal Python error: Py_Initialize: unable to load the file system codec. ImportError: No module named 'encodings' -

javascript - oscilloscope of speaker input stops rendering after a few seconds -