陆陆续续的学习c++,可以说是小白,也只是把C++ primer中的内容照搬过来当成一个总结。
1:string的size操作
首先翻阅到跟size有关的C++primer书中记载的是string的size操作。
书中提到:size用来获取string对象的长度
e.g.
int main()
{
string st(”the expense of spirit\n“);
cout << st.size() <<endl;
}
简单的说呢:这地方的size就是size(),这是一个”函数“,就是一个获取长度的一个操作。
那基本上从广义上来说,是一个函数,就应该有返回类型,即使是void(姑且把它当做一种返回类型,叫法错误,只是便于理解),
由于有返回类型便再次延伸出了个string::size_type的类型。
对于这里的size_type类型:于是翻阅网上的一些资料(主要来自于百度)。是这么阐述的:由string类类型和vector类类型定义的类型,用以保存任意string对象或vector对象的长度,标准库类型将size_type定义为unsigned类型。
读着读着,然后在vector对象的size里面又看到,丫的说明了:使用size_type时,必须指出该类型在哪定义的。
vector<int>::size_type
什么地方可以用它呢?当我们遍历容器内元素的时候,是不是要用到长度啊?用到了长度是不是有size操作,那这种类型就有用途了。
好吧,可以这么理解吧:它是一个类型,在string和vector中才能用到,用于保存对象长度的。(目前我也只能懂这么一点,等我学的更多了再着重分析)
2.标准库中bitset中的size
简单的啰嗦下:标准库提供了bitset类简化了位集的操作。bitset的对象也有关于size的操作:b.size()【b中二进制位的个数】
3.sizeof 操作符
sizeof操作符的作用是返回一个对象或类型名的长度。【尼玛,是不是太熟悉了,这丫的不就是size(),可是人家是函数,你丫是操作符啊!!!】
操作符?操作符?操作符? 操作?size()也是操作啊?那就有返回类型:size_t。
请问size_t和size_type有嘛关系啊?是不是同一个人啊?尼玛,我才学啊,我哪知道。
描述:sizeof有三种语法方式:
sizeof(type name);
sizeof(expr);
sizeofexpr;
什么是size_t类型呢?其实本质上和size_type没有多大区别
其实size_t和size_type类似,size_t类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版本.它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小
简单的说size_t 没有容器的概念,size_type有容器的概念。
后期更新:更新的内容是源于面试中关于sizeof的考察问题,在这地方进行一个说明和总结:
上述所涉及到以下几种类型:
(1)char * ss1 是一个字符指针,对于一个字符指针而言,指针的大小事4个字节,所以sizeof(ss1)是4个字节
(2)char ss2[]是一个字符数组,数组最初没有指定大小,那么就由其填充的填充值来决定,于是10个字符占用十个字节,再加上隐含的“\0”,所以式11个字节。
(3)char ss3[100],数组最初指定了100个字节的大小 所以是100;
(4)ss4是整型数组,也是分配了100,由于每个整型变量占4个字节,所以大小总共是400字节。
(5)q1与ss2类似,占用4个字节
(6)q2里面\n算一个字节,所以总共是3个字节
(7)q3是字符指针,指针的大小是定值,占4个自己
(8)(9)这主要考察的是结构体的长度问题。关于结构体长度的问题,在默认情况下,为了方便结构体内元素的访问和管理,当结构体内的元素长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位,也就是说结构体的长度一定是最长的数据元素的整数倍。如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对齐单位。
所以sizeof(A)而言,结构体A中有3个short类型变量,各自取2字节对齐,结构体对齐参数按默认的8字节对齐,则a1、a2、a3都去2字节对齐,sizeof(A)为6,其也是2的整数倍。
B中a1为4字节对齐,a2为2字节对齐,结构体大小为6字节,6不是4的整数倍,补空字节,增到8时,符合条件。所以sizeof(B)为8(这地方其实涉及到了CPU优化和内存对齐的问题。关于内存中数据对齐的问题,在之后的章节会详细介绍。另外对于不同数据类型占用多少字节的问题,也会在之后的章节中详细介绍。)
4:关于容器等size操作
关于容器等相关的一些size操作再此就不赘述了,简单以顺序容器中对容器大小的操作位例来说:
其返回类型都是size_type类型:c.size/c.max_size/等,这些具体的一些操作在实际运用中使用而已