c - 嵌套类字符串结构中的嵌入与指针

标签 c pointers struct datadesign

在设计包含文本数据的结构时,我一直在使用如下所示的两种基本方法:

typedef struct {
    STRING address1;
    STRING address2;
    STRING city;
    STRING state;
    STRING zip;
} ADDRESS;

typedef struct {
    STRING* address1;
    STRING* address2;
    STRING* city;
    STRING* state;
    STRING* zip;
} ADDRESS;

其中 STRING 是某种可变长度字符串存储类型。指针版本的优点是我可以存储 NULL 来指示数据丢失。例如,某些地址可能未提供 address2。在嵌入字符串的类型中,我必须使用“空白”字符串,即长度为 0 的字符串。

使用指针(可能)会有更多的代码负担,因为我必须在使用之前检查每个成员是否为 NULL。然而,优点并不是那么大,因为通常也必须检查嵌入式版本。例如,如果我要打印地址,我必须检查零长度字符串并跳过该行。通过指针,用户实际上可以表明他们想要一个“空白”而不是缺失值,尽管很难看出这样做的用途。

当创建或释放结构时,指针会添加一堆额外的步骤。我的本能是标准化嵌入式样式以节省这些步骤,但我担心可能存在隐藏的问题。这是一种毫无根据的恐惧,还是我应该出于某种令人信服的原因使用这些指针?

请注意,内存使用是一个问题,但影响很小。指针版本需要更多的内存,因为除了结构之外,我还存储指向结构的指针。但每个字符串结构平均可能需要 40 个字节,因此如果我存储 4 个字节指针,那么指针版本可能会多花费 10% 的内存,这并不重要。可能存在空指针并不会节省大量内存,因为大多数字段都已填充。

问题是关于地址而不是字符串

一些受访者似乎很困惑,认为我在询问全局权衡,例如如何最大限度地减少我的总工作量。事实并非如此。我问的是如何设计地址,而不是字符串。地址的成员可以有固定的数组,或者在其他情况下没有。就我的问题而言,我并不关心容器的后果。

我已经说过,我看到的唯一问题是使用指针会花费更多时间,但我得到了能够存储 NULL 的好处。然而,正如我已经说过的,这种好处似乎并不显着,但也许是出于某种原因。这就是我的问题的本质:拥有这种灵 active 是否有一些我没有看到并且希望以后能拥有的隐藏好处。

如果您不明白这个问题,请阅读下面我自己写的初步答案(经过一些额外的思考),看看我正在寻找什么样的答案。

最佳答案

权衡内存使用和减少 malloc

似乎权衡围绕两个问题:1)内存有多宝贵? 2)为字符串分配固定数量的内存,限制每个字段中存储的长度,这是否重要?

如果内存比其他任何东西都重要,那么指针版本可能会获胜。如果首选存储使用的可预测性和避免 malloc,并且可以接受将名称长度限制为某个固定量,那么固定长度版本可能是赢家。

关于c - 嵌套类字符串结构中的嵌入与指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55744259/

相关文章:

c - 重定向在 shell::ls 中不起作用:无法访问 >: 没有这样的文件或目录

c - 搜索并删除 BST 前驱(或后继)

qt - 如何销毁 QML 中的上下文指针?

c++ - 使用指向引用 vector 的指针 vector 是非法的?

有人可以向我解释一下代码的工作原理吗?这段代码应该打印一个数字的反转

c++ - 从 C/C++ 播放声音的最简单方法

c++重载具有不同参数的3个函数(int,* int,& int)

struct - 检测新的结构初始化

c - 显示数组类型的结构程序具有不完整的元素类型

c++ - 数组中的错误功能排序