2010-09-21 84 views
2

标题有点混乱,所以我会用一些例子来解释一下。只是一个说明:我解析文件格式。假设我们有这样的结构:好方法来存储各种各样的大小也不同的结构?

struct example 
{ 
    typeA a; 
    typeB b; 
    typeX x; 
    typeY y; 
    typeZ z; 
}; 

到目前为止它确定。现在的问题是,typeXtypeYtypeZ可能会有所不同。根据文件头中的标志(元数据),它们可以是两个或四个字节大。另一件事是,有几个这样的结构(约40)。他们每个人使用typeXtypeYtypeZ。其中一些,一些只有一两个。最后,他们大多数是可选的,所以可能只有四个或五个结构使用,或20或30 ...

我想知道如果有人有一些想法如何存储这样一个不同的数据集。我想过使用模板,但不知道它是否正确。

编辑:澄清更多:内存不是一个大问题,所以我可以承受浪费一点空间。如果typeX是四个字节,那么所有结构都是如此。 Hovewer它们没有同步,所以typeX可以是4个字节,typeZ可以是2个。大多数结构可能会被多次使用,所以可以有50个example1结构,10个example2结构等。

+3

他们保持同步吗?像他们都是两个字节,或全部4个字节?或者它们各自独立变化?你有多少价值?有没有什么强大的动力来节省内存?从每个结构中删除几个字节? – djna 2010-09-21 08:54:05

回答

2

对我来说没有那么多的处理分配一些空间,在概念上,我们可以做到这一点的问题:

byte *pA = new byte[the size this time]; 

而是你与这些对象的typeA做什么。

pA->getValue() 

return?它的意图是,它总是,比如32位数字?还是我们真的有

pA->get16bitValue() 
在某些情况下

pA->get32bitValue() 
在别人

我会寻求一种方法来首先封装这种差异,并且非常依赖于您如何使用这些值的方式。存储问题可能通过一些动态分配来解决。这是我看到的那种类型A的真正beahviour。

+0

好点。该值始终是一个无符号数字。它总是一个索引,可以有超过64K条目的另一个结构(因此需要2/4字节大小)。所以看起来我总是可以看看这个数字,就好像它是一个无符号的32位数字一样。 – PeterK 2010-09-21 10:07:32

1

一个因素,你没有上面提到的,因为你正在解析一个文件,这个软件是否打算与CPU无关。一些CPU是小端的,这意味着一个数据项存储在最低有效字节的第一个字节和最高有效字节的最后。其他CPU是big-endian,字节顺序是相反的。当你解析一个文件时,如果这个文件可能是用一个相反的字节顺序的CPU写的,那么你必须考虑这个问题。这样做的可靠方法是定义文件格式所需的字节顺序,然后一次读取一个字节的文件,并使用适当的移位运算符构造数据。

intVal = (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]; 

所以你看到直接读取文件到结构中可能不是一个好主意。

您应该将文件视为流(它就是这样)并定义流操作以将数据一次传输到您的内部内存结构中。

如果您接受此选项,则文件格式将与您的内部存储器结构分离。然后,您可以在内部存储数据,只要您喜欢。在你的情况下,它听起来像是多态的理想应用。您可以为typeX/Y/Z的每个变体声明一个子类。或者你可以使用一个类,并让它在其构造函数中分配可变数量的内存。这一切都取决于你的情况。关键是将文件格式与内部存储器结构分离。

+0

我有一个阅读文件的类,它为我解决了所有与endian相关的问题。 – PeterK 2010-09-21 09:06:25

+0

我的担心是你试图将一个结构直接映射到文件上。只要你不这样做,那么我认为你回答你的问题并不重要。由于内存不是问题,并且如果特定文件中所有* typeX *的出现次数都是相同的大小(?),我总是将其设置为最大大小。文件中的数据可能不需要整个内存大小的事实变得无关紧要。不要让自己比自己更难! – 2010-09-21 09:11:25

+0

好点,但我仍然很好奇,如果任何人都可以拿出一些不错的东西,不会浪费空间。 – PeterK 2010-09-21 09:21:12

相关问题