struct的成员的实际总大小

cyb*_*vnm 3 c c++ data-structures

我必须将struct Data数组写入硬盘:


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

AFAIK,大多数编译器会在数据的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;
}

如您所见,我使用代码计算Data struct的实际大小:int actualLen = sizeof(char) + sizeof(int).有没有替代方案?(像int actualLen = actualSizeof(Data))

PS这是合成的例子,但我想你理解我的问题...

Ash*_*ain 8

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

myfile << mystruct.member1 << mystruct.member2;
Run Code Online (Sandbox Code Playgroud)

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

myfile << mystruct;
Run Code Online (Sandbox Code Playgroud)

导致保存代码看起来像:

myfile << count;
for (int i = 0; i < count; ++i)
    myFile << data[i];
Run Code Online (Sandbox Code Playgroud)

IMO所有那些摆弄内存地址和memcpy的东西,当你可以这样做的时候太麻烦了.这种通用技术称为序列化 - 谷歌更多,它是一个发展良好的领域.