首页
学习
活动
专区
工具
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的构造函数,之后便是一般的初始化流程了~可以看到,初始化列表的引入让容器的初始化变得非常简洁,并且对于非标准库的容器

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

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

    2.3K20

    MSVC std::any 源码解析

    false std::cout std::_Any_is_trivial std::endl; RTTI Trivial 类型的内存是直接对拷的,对于这种内存无需再添加额外的生命周期指针..._Emplacet>(_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.4K41

    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、...::coutstd::endl; 1143 1144 } 1110行函数TarsSkipToTag会确认TYPE和TAG的值 1113

    7.7K31

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

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

    71450

    【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进行的是一个字节一个字节拷贝,是浅拷贝

    9510

    C++ 特性使用建议

    改用更安全的分配器(allocator),像 std::vector 或 std::unique_ptrT[]>,可有效避免内存越界错误。 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操作符对传递给它的表达式进行“伪计算”,然后返回表达式类型的大小吗?

    3K20

    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.4K51

    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

    shared_ptr 和 unique_ptr 深入探秘

    通常 unique_ptr 就是简单的对裸指针封装,并且禁用拷贝和赋值:templateT, class Deleter = std::default_deleteT>>...而 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 在设计上的区别,对于不同使用场景下选择不同智能指针的体会也更加深刻。

    45710

    可变参数模板

    通过这些形式,我们可以灵活地处理传入的不同数量和类型的参数。 sizeof... 运算符 sizeof... 是一个操作符,用于计算参数包中参数的数量。...包扩展的基本概念 对于一个参数包,我们可以: 计算参数包的元素数量(使用 sizeof... 操作符)。 进行包扩展,将参数包的元素逐个展开,并应用指定的模式。...emplace_back 的使用示例 以下示例代码展示了 emplace_back 的不同用法: #include list> #include #include 的代码 在实际编译过程中,编译器会根据传入的参数类型为 emplace_back 和 insert 生成适当的重载版本。...例如,对于以下代码: lt.emplace_back("111111111111"); 编译器会自动生成以下版本的 emplace_back 函数: void emplace_back(const char

    15310

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

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

    字节一面,new出来的对象真的不可以用free释放吗?

    本文是一道C++面试的基础题——new出来的对象可以用free释放吗?它甚至还有一个变体——malloc分配的内存可以使用delete释放吗?...new会自动计算需要分配的内存大小,malloc需要手动计算。...针对于非POD类型,由于其具备构造函数和析构函数,且其构造函数和析构函数可能存在内存、资源的分配与释放,所以new/delete和malloc/free在处理非POD类型时存在差异。...必须要配套使用,不可混用 由上的理论分析可知,非POD类型必须配套使用new/delete和malloc/free已经达成共识了,只是对于POD类型,目前还持怀疑态度,所以本文将以实验的形式对POD类型进行验证...; i++) { auto p = (T*)malloc(sizeof(T)); if (p) { *p = 10; std::cout std::endl;

    4600

    C++:模拟实现vector

    2.vector可以看做顺序表的升级,但是模拟实现vector跟我们以往实现顺序表有所不同,顺序表是使用一个动态开辟的数组、数组有效元素个数size和数组容纳最大有效数据的个数capacity维护的,而模拟实现...3.memcpy浅拷贝问题 memcpy(tmp, _start, size() * sizeof(T)); memcpy是浅拷贝,如果vector存的是内置类型,那么浅拷贝就没有问题,如果存的是自定义类型...这里又有个问题,就是while循环判断条件的!=不能改成对于vector的迭代器时可以的,但是对于其他容器的迭代器,如list,last不一定比first要大。...因为val的类型不确定,可能是内置类型,也可能是自定义类型。 在不传参使用缺省值时 对于自定义类型,比如strng,先调用构造函数构造一个匿名对象,再拷贝构造给val。...(编译器会优化,直接对val进行构造),这样val就有了缺省值。 对于内置类型,本来是没有构造函数的说法的,但是为了适应这里,也支持类似类那种使用构造函数初始化的方式。

    9610

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

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

    13410
    领券