【发布时间】:2015-06-10 13:43:47
【问题描述】:
我有一个数据结构,将在函数中读取。
我想要尽可能小的内存、代码大小和速度占用。我正在开发 AVR。
typedef struct {
uint16_t clu;
uint16_t num;
uint32_t cur_rel;
} FSAVEPOS;
现在,一个将文件位置存储到结构中的函数:
// Approach 1
FSAVEPOS save_pos(const FFILE* file); // return value
// Approach 2
void save_pos(const FFILE* file, FSAVEPOS* pos); // modify reference
还有一个反转这个的函数(FFILE对象被修改):
// Approach 1
void restore_pos(FFILE* file, const FSAVEPOS pos); // pass by value
// Approach 2
void restore_pos(FFILE* file, const FSAVEPOS* pos); // pass by reference
您认为最好的主意是什么?
【问题讨论】:
-
顺便说一句,制作价值参数
const毫无意义。这是可能的,并且使它们在函数内表现得像常量变量,但它不会使界面更清晰。我建议不要这样做。 -
你确定是坏的吗?我特别在指针上使用 const 来表示它们不会被更改。可以说它对标量没有意义,但它不应该伤害任何东西......
-
最小的内存占用可能意味着您必须将指针传递给该结构,但您必须尝试并查看。也许写一个小测试程序并看看编译器做了什么(优化),如果你传递一个结构,编译器可能会优化它以传递一个指针
-
@unwind:
conston 指针可用于确保指针不会被无意更改。指向const struct的指针的好处希望是显而易见的:指向的对象不能更改。这使得这在大多数时候成为通过副本传递结构的好(和更快)替代方案。对于标量,我也看不出有多大意义(但可能会强制执行单一分配策略。 -
@dwelch:ARM AAPCS 可能会在寄存器中传递小结构。对于较大的结构作为参数,这通常是一个坏主意。对于结果,如果结果仅由调用者使用,则实际上并没有什么区别(结构在堆栈上分配,其中一个指针传递给被调用者)。