首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

对于不同类型的T,sizeof(std :: list <T>)会有所不同吗?

对于不同类型的T,sizeof(std::list<T>)会有所不同。std::list<T>是C++标准库中的双向链表容器,其中的元素以节点的形式存储,每个节点包含一个T类型的数据和两个指针,分别指向前一个节点和后一个节点。因此,sizeof(std::list<T>)的大小取决于T类型的大小以及链表节点的大小。

具体来说,sizeof(std::list<T>)的大小可能会因为以下因素而有所不同:

  1. T类型的大小:如果T类型的大小不同,那么链表节点中存储的数据量也会不同,从而导致sizeof(std::list<T>)的大小不同。
  2. 链表节点的大小:链表节点中除了存储T类型的数据外,还需要存储指向前一个节点和后一个节点的指针。如果链表节点的大小不同,那么sizeof(std::list<T>)的大小也会不同。

总之,sizeof(std::list<T>)的大小会因为T类型的大小和链表节点的大小而有所不同。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++11(14) 简易推荐小记~

, 25, 25, 25, 25, 36 }; std::list l; for (int i = 0; i < sizeof(ages) / sizeof(int); ++i) {...中,它作用(之一)变成了自动类型推导,还记得最早那个迭代器声明:   std::list::const_iterator beg = l.begin();   使用auto的话只要这么写就行了...,即 auto& val 可以看作T& val,用于匹配不同类型~   至于{ ++val; }就是函数体了,没啥好说,一目了然~   OK,现在为止,add_one定义就清楚了,简单来说,它其实就是一个接受单个参数函数对象...,新标准还为数组重载了std::begin和std::end,对于其他类型容器,你也大可以自己重载实现它们,而外部逻辑代码则都是调用std::begin和std::end,一致性很好 !   ... 25, 25, 25, 36 }会被构造为一个initializer_list并传入list构造函数,之后便是一般初始化流程了~可以看到,初始化列表引入让容器初始化变得非常简洁,并且对于非标准库容器

38720
  • MSVC std::any 源码解析

    false std::cout << std::endl; RTTI Trivial 类型内存是直接对拷对于这种内存无需再添加额外生命周期指针..._Emplace>(_Ilist, _STD forward(_Args)...); } 拷贝构造对应三种内存形态有着不同拷贝方式,对于 Trivial..._Emplace 中则是针对不同内存创建 _Storage,这里要注意是 _TypeData 处理手法,是取类型对应 std::type_info 指针并与 enum 定义指针相或,从而取得每个类型独一无二一个...这里要注意是返回类型根据 std::any_cast 入参产生变化: const any* const -> const _ValueType* any* const _Any -> _ValueType...:any_cast 校验类型 std::any_cast 依据 std::type_info 做类型校验 std::any_cast 返回值根据入参类型发生变化,入参为指针则返回指针,否则返回 remove_cv_t

    1.3K41

    c++11增加变参数模板,今天总算整明白了

    (age)是计算形参包里形参个数,返回类型std::size_t,后续同理 if ( (sizeof ......,该可变形参包可以接受无限个不同实参类型。...再看看对于成员函数print调用,我原意是想针对每一种容器类型,都打印出结果,但现在只打印了一种,我们可以想想,对于继承,非虚函数但函数类型相同情况下,派生类成员函数覆盖基类成员函数,所以这里结果是正常...__args到底代表什么呢,抛开右值引用不说,它就是多个参数,难道是可以在容器中插入多个不同类型元素,并不是啊,容器中元素是必须要一致,这里参数其实是容器定义时元素类型构造函数多个参数,也就是说...这么一看,这不就是我们第4节里面说形参包展开第二种方法一种实际使用案例,只是这里使用了std::forward实现了完美转发而已。

    2.2K20

    Tars-C++ 揭秘篇:Tars协议解析

    3 所有NetThread都有可能接收客户端连接,生成Connection,Connection按照一定规则分配到不同NetThread上 4 不同NetThread通过Connection,将接收到内容放到同一个队列...size_t tarsResponseLen(const char* recvBuffer, size_t length, list& done) {...9.2.4 协议序列化分析-HEAD 把结构化数据序列化,用大白话解释就是想办法把不同类型数据按照顺序放在一个字符串里。反序列化就是还能从这个字符串里把类型和数据正确解析出来。...后八位为TAG2值200(即11001000) 9.2.5 协议序列化分析-BUF | HEAD | BUF | BUF内容和所占据字节数根据不同TYPE而有所不同 (1)基本类型(Short、...::cout<<"read Short n is "<<n<<std::endl; 1143 1144 } 1110行函数TarsSkipToTag确认TYPE和TAG值 1113

    7.5K31

    CC++开发基础——可变参数与可变参数模板

    在C++语言中,C++11标准提供了两种使用可变参数方式: 1.如果可变参数参数类型相同,可以使用标准库中initializer_list。...2.如果可变参数参数类型不同,可以使用可变参数模板。 C语言中,在定义可变参数函数时,使用省略号"..."表示参数是可变。...2.可变参数相关宏定义 在C语言中,一般需要借助相关宏定义来实现可变参数,常见宏定义如下: va_arg:每一次调用va_arg获取当前参数,并自动更新指向下一个可变参数。...类型名...表示接下来参数是零个或多个给定类型函数参数列表。 比较一下"typename T"和"typename.....Args": Args和T差别是,T与一种类型匹配,而Args与任意数量(包括零)类型匹配。

    54950

    【C++】Vector简易模拟与探索

    = _finish - _start; T* tmp = new T[n]; //memcpy(tmp, _start, oldsize * sizeof(T)); //拷贝数据,浅拷贝对于...typedef成iterator,所以对于vector类来说其迭代器实质上就是T*,是一个指针;但要注意不是所有的迭代器都是指针,例如list迭代器就不是,我们后续再学习 const迭代器 提供给...可以存储不同类型数据,相应迭代器也会有所不同,所以使用函数模板 ✨n个val构造 //n个val构造 vector(size_t n, const T& val=T())//缺省值不能给0,因为...是C++新增一个类型,方便初始化,支持将花括号括起来值给initializer_list,initializer_list对象里面有两个指针,指向花括号里面值开始和结尾下一个,并支持迭代器,所以可以使用范围...memcpy(tmp, _start, oldsize*sizeof(T)); 来拷贝数据,如果数据是int类型不会有什么问题,但如果是string类,memcpy进行是一个字节一个字节拷贝,是浅拷贝

    8410

    shared_ptr 和 unique_ptr 深入探秘

    通常 unique_ptr 就是简单对裸指针封装,并且禁用拷贝和赋值:template>...而 delete 一个不完整类型指针是 ub(undefined behavior)。在典型实现中都会在 delete 前通过 static_assert(sizeof(T) > 0) 做检查。 ...sizeof 对 incomplete type 求值直接编译出错。incomplete type 是指当定义一个变量时候,不知道应该分配多少内存。...继续深挖一下,这个问题会出现在 shared_ptr ?答案是不会。这又引入了另一个问题,shared_ptr 和 unique_ptr 封装有什么不同?...虽然只是一个小小知识点,但是也帮助我深入理解了 shared_ptr 和 unique_ptr 在设计上区别,对于不同使用场景下选择不同智能指针体会也更加深刻。

    39310

    C++ 特性使用建议

    改用更安全分配器(allocator),像 std::vector 或 std::unique_ptr,可有效避免内存越界错误。 6.友元 允许合理使用友元类及友元函数。...如果你代码需要根据不同对象类型执行不同行为的话,请考虑用以下两种替代方案之一查询对象类型: (1)虚函数可以根据子类类型不同而执行不同代码。这是把工作交给了对象本身去处理。...如果程序中需要不同大小变量,可以使用 中长度精确整型,如 int16_t。如果您变量可能不小于 2^31,就用 64 位变量比如 int64_t。...宏意味着你和编译器看到代码是不同。这可能导致异常行为,尤其因为宏具有全局作用域。值得庆幸是,C++ 中,宏不像在 C 中那么必不可少。以往用宏展开性能关键代码,现在可以用内联函数替代。...,列表初始化也适用于常规数据类型构造,哪怕没有接收 std::initializer_list 构造函数。

    1.7K20

    现代C++之SFINAE

    它是如何工作?好吧,如果您懒于阅读其余内容,这是我能给您最简单答案:与动态类型语言不同,您编译器一旦启动便可以访问许多静态类型信息。我们可以限制您编译器对这些类型进行一些工作是有意义!...对于那些卡在c++ 11和c++ 14之间的人来说,这也很有趣。 c++ 98中解决方案依赖于3个关键概念:重载解析、SFINAE和sizeof静态行为。...根据名称找出所有适用函数和函数模板对于适用函数模板,要根据实际情况对模板形参进行替换; 替换过程中如果发生错误,这个模板会被丢弃 在上面两步生成可行函数集合中,编译器寻找一个最佳匹配,产生对该函数调用...解决方案包括将序列化功能分为两个不同功能:一个仅使用obj.serialize(),另一个根据obj类型使用to_string。 我们回到一个已经解决较早问题,如何根据类型拆分?...3.1 decltype, declval, auto & co decltype 还记得sizeof操作符对传递给它表达式进行“伪计算”,然后返回表达式类型大小?

    2.9K20

    C++11 变参模板

    可变模版参数和普通模版参数语义是一致,可以应用于函数和类,然而,函数模版不支持偏特化,所以可变参数函数模版和可变参数类模版展开参数包方法有所不同,下面我们来分别看看他们参数包展开方法。...(T) <<" "<< sizeof......我们知道逗号表达式按顺序执行逗号前面的表达式,返回最后一个表达式结果,比如: d = (a = b,c); 这个表达式按顺序执行:b先赋值给a,接着括号中逗号表达式返回c值,因此d将等于c。...Args> void expand(const F& f, Args&&...args) { initializer_list{(f(std::forward(args)),...Types> class tuple; 这个可变参数模板类可以携带任意类型任意个数模板参数: std::tuple tp; std::tuple tp1 = std::make_tuple

    3.3K51

    C++那些事之SFINAE

    它是如何工作?好吧,如果您懒于阅读其余内容,这是我能给您最简单答案:与动态类型语言不同,您编译器一旦启动便可以访问许多静态类型信息。我们可以限制您编译器对这些类型进行一些工作是有意义!...对于那些卡在c++ 11和c++ 14之间的人来说,这也很有趣。 c++ 98中解决方案依赖于3个关键概念:重载解析、SFINAE和sizeof静态行为。...根据名称找出所有适用函数和函数模板对于适用函数模板,要根据实际情况对模板形参进行替换; 替换过程中如果发生错误,这个模板会被丢弃 在上面两步生成可行函数集合中,编译器寻找一个最佳匹配,产生对该函数调用...解决方案包括将序列化功能分为两个不同功能:一个仅使用obj.serialize(),另一个根据obj类型使用to_string。 我们回到一个已经解决较早问题,如何根据类型拆分?...3.1 decltype, declval, auto & co decltype 还记得sizeof操作符对传递给它表达式进行“伪计算”,然后返回表达式类型大小?

    2.2K20

    60秒问答:多态和函数重载关系?

    编译时多态:函数重载和运算符重载(根据参数不同选择具体函数 ) 运行时多态:通过类继承和虚函数实现(根据虚表指针 指向 派生类函数,还是基类函数) 四、 类型转换有几种情况,有什么区别?...【定义】 多态是指两个或多个属于不同对象,对于同一个消息(方法调用)作出不同响应方式。...::cout #include // std::insert_iterator #include // std::list #include...void* operator new (std::size_t size) void* operator new (std::size_t size, const std::nothrow_t& nothrow_value...编译时多态:函数重载和运算符重载(根据参数不同选择具体函数 ) 运行时多态:通过类继承和虚函数实现(根据虚表指针 指向 派生类函数,还是基类函数) 四、 类型转换有几种情况,有什么区别?

    1.4K10

    【c++】探究C++中list:精彩接口与仿真实现解密

    6个元素,必须从已知位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性时间开销;list还需要一些额外空间,以保存每个节点相关联信息(对于存储类型较小元素list来说这可能是一个重要因素...请注意对于 std::list,这个行为是有效,因为 erase 不会影响除了被删除元素之外任何迭代器。...但如果是其他类型容器,如 std::vector 或 std::deque 中使用相同技巧就可能会出问题,因为这些容器 erase 操作可能导致所有指向被删除元素之后元素迭代器全部失效。...对于排序操作,std::list 提供了特定成员函数 sort 以优化排序算法,因为链表不支持随机访问,标准排序算法(如 std::sort)不适用。...这样,我们可以创建一个常量迭代器,为Ref和Ptr参数指定常量类型,例如: ListIterator const_iterator; 对于非常量迭代器,就简单地传递非常量类型引用和指针

    10510

    现代C++教程:高速上手(四)-容器

    1、线性容器 std::array与std::vector不同是,array对象大小是固定,如果容器大小是固定,那么可以优先考虑使用std::array容器。...和list双向链表实现不同,forward_list使用单向链表进行实现,提供了O(1)复杂度元素插入,不支持快速随机访问,也是标准库容器中唯一一个不提供size()方法容器。...在插入元素时,根据<操作符比较元素大小并判断元素是否相同,并选择合适位置插入到容器中。当对这个容器中元素进行遍历时,输出结果按照<操作符顺序来逐个遍历。...,除了std::pair外,似乎没有现成结构能够用来存放不同类型数据。...: int index = 1; std::get(t); //非法 c++17引入了std::variant,提供给variant类型模版参数 可以让一个variant从而容纳提供几种类型变量

    84720
    领券