账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Qlist 拷贝构造产生的原因
    129
    0

    1) 如下代码,RowOfData rowData = tableData[row]; 触发RowOfData拷贝构造
    2)tableDatarow = item; 此时tableDatarow也会触发QtParameter拷贝构造,并调用 QList<T>::node_copy执行深拷贝,是为什么呢,是编译器
    影响的么,去掉RowOfData rowData = tableData[row];就不会执行QtParameter拷贝构造与 QList<T>::node_copy。
    3)看似多余的RowOfData rowData = tableData[row];,为什么会影响后面Qistx的深拷贝呢,是因为RowOfData rowData = tableData[row];调用了浅拷贝,编译器为避免出错,让tableDatarow执行了拷贝构造么。不是很确定,很诡异的一个问题。

    QtParameter::QtParameter( const QtParameter& rhs) :QVariant(rhs)
    {
    }
                class RowOfData : QList<QtParameter>
                {
                   public:
                      RowOfData(const RowOfData& rhs);                 
                   private:            
                }
    
                class TableData
                {
                   public :
                        TableData();
                        virtual ~TableData();
                        bool setItem(int row, int col, QtParameter item);                    
                  protected:
                        QStringList         columnHeader;
                        QStringList         rowHeader;
                        QStringList         rowFooter;
                        QList< RowOfData >  tableData;              
                }   
    
       bool TableData::setItem(int row, int col, QtParameter item)
        {
                  if(row<rowCount())     
                   {                
                        RowOfData rowData = tableData[row];
                /*useless here and impact the tableData[row][col] copy constructer× */            
                        if( col < tableData.at(row).size() )
                        {
                            tableData[row][col] = item;
                        }
                    }
        }                     
                            
            template <typename T>
            Q_INLINE_TEMPLATE void QList<T>::node_copy(Node *from, Node *to, Node *src)
            {
                Node *current = from;
                if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) {
                    QT_TRY {
                        while(current != to) {
                            current->v = new T(*reinterpret_cast<T*>(src->v));
                            ++current;
                            ++src;
                        }
                    } QT_CATCH(...) {
                        while (current-- != from)
                            delete reinterpret_cast<T*>(current->v);
                        QT_RETHROW;
                    }
            ...
            }
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 共 0 条
    • 爱只为她 普通会员 1楼

      QList(即可变长度队列)是Python中一个用于存储和访问数据的内置类,它由两个关键属性组成:list(可变长度列表)和len(列表长度)。QList的创建原因主要有以下几个方面:

      1. 集合的实现:QList的底层实现使用了Python的双端队列(deque)数据结构。双端队列是一种双端存储的线性数据结构,可以存储任意大小的元素,并且可以在两端同时插入和删除元素,具有较好的内存效率和空间效率。Python的deque类实现了双端队列的功能,因此QList的创建也采用了 deque。

      2. 数据结构优化:Python的list默认情况下是动态数组,其元素可以动态添加和删除,但随着元素数量的增加,可能会导致列表长度增大,内存占用也随之增加。而双端队列(deque)不仅可以动态扩容(即在需要时增加存储空间),还可以动态缩容(即在需要时减少存储空间),这样可以有效地利用Python的内存资源,降低Python运行时的内存消耗。

      3. 提高性能:QList的内部实现使用了Python的双端队列,可以避免Python的list类对内存的频繁访问和增长。每次插入或删除元素时,Python都会使用双端队列的移动操作(如push和pop)来更新列表的长度和元素的位置,而不需要进行list的内存分配和释放,因此在访问和删除元素时,QList的性能通常会比list类更高。

      4. 数据结构继承:QList可以继承自list类,这意味着QList可以继承list的所有属性和方法,如添加元素、删除元素、查看元素位置等。这意味着QList的创建可以更加灵活和便捷,只需要继承list类即可实现QList的所有功能。

      综上所述,QList的创建是为了实现集合数据结构的优化,提高性能和灵活性,同时也为了继承Python的list类,提供了一种更为高效的数据访问和操作方式。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部