2015-04-18 30 views
1

如何知道qt數據類型的字節大小;包括QString對象,如果這些數據類型寫在某些QFile上的話。我必須在Student類中實現sizeOf()函數,如下所示;像在我們C. sizeof(struct student)計算Qt中對象的序列化大小

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。​​

回答

4

sizeof將給你的大小不反映對象可能具有的實際大小。例如,32位版本中的sizeof a QString將始終爲4個字節,無論實際字符串有多長。

這個sizeof運算符包含不需要序列化的東西,比如對象的vtable指針,並且不考慮該對象的動態分配資源的大小。

您可以輕鬆地確定序列化的大小,只需用QDataStream,從device()之前得到pos(),輸入數據流中的對象,並與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; 
}; 

然後使用它:

SerialSize size; 
    qDebug() << size(QString("a")); // 6 
    qDebug() << size(QString("aa")); // 8 
+0

'size + = sizeof(quint8 * 3)'只是一個輸入錯誤。我編輯了這個問題。 – stackOverflow

+0

爲了首先初始化,然後傳遞給流的構造函數,不應該在QDataStream流的上面添加'QBuffer data'成員? – Spyros

+0

@Spyros - 沒錯,在這種情況下似乎沒有任何問題,但下一次可能不那麼幸運。 – dtech

0

在執行sizeof功能時,您應該嘗試將更改爲size+=sizeof(quint8*3)size+=sizeof(quint8) * 3

+0

打錯了..看看我的編輯 – stackOverflow

+0

的sizeof是不正確的! –