QList如何决定是存储指针还是存储项目本身
How does QList decide whether to store pointers or the items themselves?
来自文档:
在内部,QList表示为指向项的指针数组如果T本身是指针类型或基本类型大于指针,或者如果T是Qt的共享类之一,那么QList将项目直接存储在指针数组中。
我很想知道,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
来确定类型属性。CCD_ 4是为各种类型单独声明的。在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
定义。
相关文章:
- 存储指针值需要多少位
- 如何存储指针以功能模板,该模板将可呼叫对象作为其参数之一
- 为什么unique_ptr向量是存储指针的首选方法
- 我应该如何在Qt中存储指针
- 强制提升变体以存储指针
- 更好的是:存储对象与存储指针
- 在课堂上存储指针
- c++在存储指针元组时遇到问题
- 尝试学习boost::interactive Q3-在IC中存储指针时,我应该使用smart_pointer吗
- boost::numeric::ublas::矢量内部数据存储指针
- QList如何决定是存储指针还是存储项目本身
- 这些存储指针数组的方法之间有区别吗
- Boost属性树:如何在其中存储指针
- 在std::容器中选择存储值还是存储指针时的注意事项
- 在 std::vector 中存储指针会破坏连续内存存储的优势
- 设置不存储指针集合
- 在类中存储指针或对象
- 如何存储指针的矢量,包含不同的类型
- C++:字段对象可以在不存储指针的情况下知道其"parent"吗?
- 如何为在 std::map 中存储指针的模板类编写复制构造函数