- 论坛徽章:
- 2
|
回复 97# walleeee
我也倾向隐藏定义。但这只是一种倾向,不是绝对准则。
327的之前问题就是因为C不支持private,无法控制公开了定义的成员被访问,所以绝对要隐藏定义。
我还想过如何获得隐藏定义的好处,且尽量减少损失。
假设X是暴露的,Y是隐藏的。
1. 对需要new X的case: 那其实Y并没有损失什么, 都是动态分配
2. Y的损失是在X可以在栈上分配的case
如果Y依然隐藏定义, 但暴露其大小与对齐。
- // libY.h
- struct Y;
- extern size_t Y_size;
- extern size_t Y_alignment;
复制代码 大小与对齐与Y的定义总是同步的:
- struct Y { ... };
- size_t Y_size = sizeof(Y);
- size_t Y_alignment = alignof(Y);
复制代码 而且Y的改动不会触发更多的编译依赖:
- void userY(void) {
- Y* y = stack_acquire(Y_size, Y_alignment);
- g(y);
- stack_release(y);
- }
复制代码 stack_acquire/release虽然依然比调用栈分配要慢, 但被实现得比malloc高效(执行速度,内存占用,碎片情况), 因为它只需要处理栈式的请求。
不过这样手工编写太多的代码, 很麻烦……
|
|