c++ - 结构成员的实际总大小

标签 c++ c data-structures

我必须将结构数据数组写入硬盘:


struct Data {
  char cmember;
  /* padding bytes */
  int  imember;  
};

据我所知,大多数编译器会在 Data 的 cmember 和 imember 成员之间添加一些填充字节,但我只想保存到文件的实际数据(没有填充)。
我有下一个用于保存 Datas 数组的代码(为了简化,在缓冲区而不是文件中):


bool saveData(Data* data, int dataLen, char* targetBuff, int buffLen)
{
  int actualLen = sizeof(char) + sizeof(int); // this code force us to know internal
                                              // representation of Data structure
  int actualTotalLen = dataLen * actualLen; 
  if(actualTotalLen > buffLen) {
    return false;
  }

  for(int i = 0; i < dataLen; i++) {
    memcpy(targetBuff, &data[i].cmember, sizeof(char));
    targetBuff += sizeof(char);
    memcpy(targetBuff, &data[i].imember, sizeof(int));
    targetBuff += sizeof(int);
  }
  return true;
}

如您所见,我使用以下代码计算数据结构的实际大小:int actualLen = sizeof(char) + sizeof(int)。还有其他选择吗? (类似于 int actualLen = actualSizeof(Data))

附言这是综合示例,但我认为您理解我的问题的想法...

最佳答案

只需一次保存结构的每个成员。如果重载 << 以将变量写入文件,则可以

myfile << mystruct.member1 << mystruct.member2;

然后你甚至可以重载 << 以获取整个结构,并在结构的运算符 << 中执行此操作,所以最后你有:

myfile << mystruct;

生成的保存代码如下所示:

myfile << count;
for (int i = 0; i < count; ++i)
    myFile << data[i];

在我看来,如果您可以通过这种方式来处理内存地址和 memcpy,那将是一件令人头疼的事情。这种通用技术称为序列化 - 访问 google 了解更多信息,这是一个成熟的领域。

关于c++ - 结构成员的实际总大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1631425/

相关文章:

c++ - invoke_result with member (operator[]) 函数

c - 使用 C 在 Linux 上查找任意文件的设备或挂载点

c - 链表、值、添加和删除

php - 在 Linux 中的 C 可执行文件和 PHP 之间传递数据结构?

算法谜题 : sequence with random access, 插入和移除

c++ - 如何在 Visual Studio 2010 中添加 Poco 库?

c++ - 谁应该拥有指针

c - 结束应用程序的 Xcode 信号

Scala 可变参数函数和 Seq

c++ - 单个进程如何处理链接到同一库的多个共享库?