所以我一直在寻找关于两个主题的经验法则指南:
MyThing make_my_thing() { MyThing m; /* ... */ ; return m; }
// Vs.
MyThing* make_my_thing() { MyThing* m = malloc(sizeof(MyThing)); /* ... */ ; return m; }
// Assume do_something() doesn't need to mutate m
void do_something(MyThing m) { /* ... */ }
// Vs.
void do_something(MyThing* m) { /* ... */ }
我正在寻找的经验法则不适合所有情况,但应该是我在一般情况下的默认情况,其中结构不是很大。
请注意我知道不同的情况可能需要不同的解决方案 - 但仍然在寻找大多数开发人员遵循的基本“默认”约定(如果存在的话)。
我在本网站上阅读了很多问题和答案,并提出了以下指导原则:
malloc
它和它的生命周期管理混乱。这些指南是否被C程序员广泛接受?如果没有,那么更普遍接受的惯例是什么?
按值或指针指南传递和返回结构
1)体积小。当struct
很小时 - 我会说<=指针大小的两倍 - 当通过struct
而不是通过指向struct
的指针时,没有什么可以丢失,大小明智。获得了通过值传递对象的简单性。
2)大尺寸。当struct
很大时,肯定通过pointer to a
struct更有效率。
3)数字对象。当struct
具有固定大小的分配并表示一个数字时,通过值似乎更好。
4)隐藏。对struct
的不透明点是隐藏struct
内部并促进面向对象代码的好方法。
对于其他情况,我会说清晰的代码 - 这通常意味着使用指向struct
的指针,因为它是C惯用语。
对于一般用法,我发现重新调整指向一个值很小的struct
的指针 - 除了一个重要的例子:形成一组函数,其中init函数返回一个指向struct
的分配指针。