Я должен записать массив данных структуры на жесткий диск:
<code>
struct Data {
char cmember;
/* padding bytes */
int imember;
};
AFAIK, большинство компиляторов добавят несколько байтов заполнения между членами cmember и imember членов Data, но я хочу сохранить в файл только актуальные данные (без отступов).
У меня есть следующий код для сохранения массива данных (в буфере вместо файла для упрощения):
<code>
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)
)
P.S. это синтетический пример, но я думаю, вы понимаете идею моего вопроса ...