例如
procfs
实际上,最深层的结构有8个嵌套结构。
我更喜欢while [[ -d /proc/$my_pid ]] ; do ...
而不是 struct {
struct {
struct {
struct {
int a;
int b;
} AA;
struct {
char *a;
int b;
} BB;
} AAA;
int c;
} DDD;
char *a;
} XX;
有任何陷阱吗?
答案 0 :(得分:3)
从性能角度来看,子结构中的分离可能会增加“父”结构中的空间浪费,因为对齐和填充要求必须针对每个子结构进行单独评估而不是全局(除非编译器能够证明没有布局兼容的struct
周围可用于别名这些子成员。)
示例:
struct Nested {
int a;
struct {
int c;
double d;
} b;
};
在大多数常见的现代机器上都会放在内存中,如
0x00 a
0x04 (padding)
0x08 b.c
0x0c (padding)
0x10 b.d
Total: 0x18 bytes
而等效的“扁平”结构
struct Flattened {
int a;
int c;
double d;
};
将使其所有成员都连续。
0x00 a
0x04 c
0x08 d
Total: 0x10 bytes
这几乎是我能想到的唯一性能缺陷。实际评估最重要的是可用性成本。深度嵌套的子结构通常使用更详细,所以你应该反思为什么你在做这个以及它是否真的值得。
这些实体是否独立,没有主要结构?在,您的客户端代码可能想要复制(或指向)其中一个?然后从父结构中取出它们的定义并为它们命名。这是常见的情况,我认为没有任何问题可以根据需要嵌套实例 - 这就是实际操作OOP时会发生什么。还要注意,如果你有指针和要在每个结构中初始化的东西,你应该提供一些功能(以类似于如何在OO语言中使用构造函数的方式),以避免复制繁琐的代码。
您是否需要以某种方式利用事实结构中的事实 - 例如,您将它们的数组作为成员(或者,在C ++中,您希望在大多数情况下利用复制构造函数的自动定义你的成员)?然后你可能没问题,虽然再次说明,没有输出一个明确的名称对你的客户来说是邪恶的(如果他们想要一个指向其中一个对象的指针以节省一些打字?)。
您是否在(已标记的)union
中使用它们作为“替代活动类型”?这是一个合法的用例 - 虽然只是为了第一级!
您是否仅为了分组而对内容进行分组?然后三思而后行,you may be falling in a similar trap as what happens sometimes with (C++) namespaces:
为什么我们不能利用患者的狂热来进行等级制?我们不能鼓励他们写这样的代码:
namespace MyLibrary { namespace Useful { namespace Utility { int f(); } namespace Business { int f(); namespace Utility { int f(); } } } }
事实证明,几乎不需要任何鼓励。人类显然喜欢写这样的东西:
MyLibrary::Useful::Business::Utility::f();
当他们这样做时似乎认为他们做了一些深刻的事情。命名函数以使它们自己的名称不同的想法似乎是令人厌恶的。即使这些名字是截然不同的,并且绝对没有理由使用这些荒谬的结构,他们仍然会接受它们,因为它们会失散已久的恋人。
过度分类的东西被高估了。