深层嵌套结构不好吗?

时间:2018-03-26 05:56:39

标签: c

例如

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;

有任何陷阱吗?

1 个答案:

答案 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();
     

当他们这样做时似乎认为他们做了一些深刻的事情。命名函数以使它们自己的名称不同的想法似乎是令人厌恶的。即使这些名字是截然不同的,并且绝对没有理由使用这些荒谬的结构,他们仍然会接受它们,因为它们会失散已久的恋人。

过度分类的东西被高估了。