【发布时间】:2020-02-10 22:39:48
【问题描述】:
C 代码应该在嵌入式系统上运行,例如 Arm CortexM 或类似系统。
两种API接口设计是可能的:
typedef struct { vars } t_object;
void init(t_object* p_object);
void run(t_object* p_object);
t_object my_object;
init( &my_object );
while(1)
run( &my_object );
或
typedef struct { vars } t_object;
t_object* init( );
void run(t_object* p_object);
void deinit(t_object* p_object);
t_object* p_my_object;
p_my_object = init( );
while(1)
run( p_my_object );
在第一种情况下,对象在堆栈上静态分配,而在第二种情况下,init() 在堆上动态分配对象。
在设计界面时选择两种方式中的一种的原因是什么?
【问题讨论】:
-
这完全取决于程序运行的环境。这两种方法各有优缺点,具体取决于平台。
-
通常让调用者负责被调用代码的内存管理是个坏主意。调用者可能不知道该责任,这将导致内存泄漏如果您这样做,则可能需要一些命名约定以使其明显,例如
allocate_object、delete_object函数。 -
@Clifford 请记住,该对象将永远只有一个实例,并且它将“永远运行”。
deinit()已提供,但因此永远不会在此处使用。 -
这并不是真正基于意见的。有一个现有的行业事实上的标准,不透明类型。人们不使用它的唯一原因是人们不知道它。
-
@Danijel 在这种情况下,动态分配没有任何作用,init() 函数可能只是返回一个指向静态对象的指针。然后,您需要调用 init 函数来获取对该对象的引用 - 从而保证在使用前对其进行初始化。请注意,您的问题中没有提到这是一个单身人士。这是相关的,所以应该提到。