gpt4 book ai didi

c++ - QList 如何决定是存储指针还是存储项目本身?

转载 作者:行者123 更新时间:2023-11-30 04:16:47 24 4
gpt4 key购买 nike

来自docs :

Internally, QList is represented as an array of pointers to items of type T. If T is itself a pointer type or a basic type that is no larger than a pointer, or if T is one of Qt's shared classes, then QList stores the items directly in the pointer array.

我很想知道,QList 如何根据类型“决定”是存储指针还是存储项目本身?

他们是否使用一些深奥的模板语法来做到这一点?

最佳答案

让我们阅读源代码(我使用的是 Qt 4.8)。

qlist.h:

struct Node { 
void *v;
#if defined(Q_CC_BOR)
Q_INLINE_TEMPLATE T &t();
#else
Q_INLINE_TEMPLATE T &t()
{ return *reinterpret_cast<T*>(QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic
? v : this); }
#endif
};

QList使用 QTypeInfo以确定类型属性。 QTypeInfo分别为各种类型声明。在qglobal.h中:

未知类型的默认声明:

template <typename T>
class QTypeInfo
{
public:
enum {
isPointer = false,
isComplex = true,
isStatic = true,
isLarge = (sizeof(T)>sizeof(void*)),
isDummy = false
};
};

指针声明:

template <typename T>
class QTypeInfo<T*>
{
public:
enum {
isPointer = true,
isComplex = false,
isStatic = false,
isLarge = false,
isDummy = false
};
};

方便类型信息声明的宏:

#define Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS) \
class QTypeInfo<TYPE > \
{ \
public: \
enum { \
isComplex = (((FLAGS) & Q_PRIMITIVE_TYPE) == 0), \
isStatic = (((FLAGS) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), \
isLarge = (sizeof(TYPE)>sizeof(void*)), \
isPointer = false, \
isDummy = (((FLAGS) & Q_DUMMY_TYPE) != 0) \
}; \
static inline const char *name() { return #TYPE; } \
}

#define Q_DECLARE_TYPEINFO(TYPE, FLAGS) \
template<> \
Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS)

基本类型声明:

Q_DECLARE_TYPEINFO(bool, Q_PRIMITIVE_TYPE);
Q_DECLARE_TYPEINFO(char, Q_PRIMITIVE_TYPE); /* ... */

它也是为特定的 Qt 类型定义的,例如在 qurl.h 中:

Q_DECLARE_TYPEINFO(QUrl, Q_MOVABLE_TYPE);

或者在qhash.h中:

Q_DECLARE_TYPEINFO(QHashDummyValue, Q_MOVABLE_TYPE | Q_DUMMY_TYPE);

QList使用 QTypeInfo<T> , 编译器选择最近的 QTypeInfo定义。

关于c++ - QList 如何决定是存储指针还是存储项目本身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17525110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com