如何知道qt数据类型的大小(以字节为单位);如果这些数据类型是在一些QFile上编写的,则包括QString对象。我必须在Student类中实现sizeOf()
函数,如下所示;像我们{C}中的sizeof(struct student)
。
学生班
#include<QtCore>
class Student
{
public:
QString name,fname;
quint8 age,weight,clss;
Student(){
}
/*the following function should return the size of this object in bytes;
I will use QDataStream & operator<<(QDataStream &out, Student &f)
function to write data to a QFile */
qint16 sizeOf()
{
// needs implementation;
}
};
QDataStream & operator<<(QDataStream &out, Student &f)
{
out<<f.name<<f.fname<<f.age<<f.weight<<f.clss<<f.next;
return out;
}
QDataStream & operator>>(QDataStream &in, Student &f)
{
in>>f.name>>f.fname>>f.age>>f.weight>>f.clss>>f.next;
return in;
}
我知道可以使用QDataStream & operator>>(QDataStream &in, Student &f)
读取数据;但我也想知道其他一些案件的尺寸。
这不会给我一个有效的文件大小。似乎Qt在序列化时增加了一些额外的位;可能是因为不同平台上的字节序独立性。实际大小始终大于sizeOf()
函数
qint16 sizeOf()
{
qint16 size=0;
size+=sizeof(quint8)*3; // size of age, weight and clss
//variables all have type quint8
size+=name.size()*16; // number of characters in string
// multiply with 16 bit QChar
size+=fname.size()*16;
return size;
}
我正在使用QFile,QDataStream api。 Windows 8上的Qt版本4.8。
答案 0 :(得分:4)
sizeof
给出的大小不会反映对象可能具有的实际大小。例如,无论实际字符串有多长,32位构建中的sizeof
a QString
将始终为4个字符。
这个sizeof
运算符包含不需要序列化的东西,比如对象的vtable指针,并没有考虑该对象的动态分配资源的大小。
您可以轻松确定可序列化的大小,只需使用QDataStream
,然后从device()
获取pos()
,输入数据流中的对象并与{{1之后。
此外,这一行显然是错误的:pos()
它不会给你三倍大小的字节。它将为您提供size+=sizeof(quint8*3)
的大小,这是乘法后结果的提升方式。
这是一个可以用来执行任务的漂亮的小班:
int
然后使用它:
class SerialSize {
public:
SerialSize() : stream(&data) { data.open(QIODevice::WriteOnly); }
template <typename T>
quint64 operator ()(const T & t) {
data.seek(0);
stream << t;
return data.pos();
}
private:
QBuffer data;
QDataStream stream;
};
答案 1 :(得分:0)
在执行sizeOf函数时,您应该这样做
尝试将size+=sizeof(quint8*3)
更改为size+=sizeof(quint8) * 3
。