基础知识
STL中的一级容器
vector 、 queue 、list
数组做为参数会被退化为指针
1 | void fun(char a[2]){ |
如上程序,在c++和c中,函数形参是一个数组时,当其接受到一个数组作为实参时,那么形参数组就会退化为一个指针。所以sizeof的值会为4,因为参数已经退化为一个指针了,所以2也就不起作用了,所以strlen的值为5。
但是在c++中,引入了引用的概念,所以如果在c++中可以传递数组的引用,保护数组不退化为指针,代码如下:1
2
3
4
5
6
7
8
9#include<iostream>
using namespace std;
void fun(char (&a)[6]){ //这里的参数必须是等于传递进来的参数的长度,不然会编译出错
cout<<sizeof(a)<<endl; //6
cout<<strlen(a)<<endl; //5
}
char a[]="Hello";
fun(a);
另外,在这里在总结一个知识点:sizeof是计算变量的内存的大小,所以需要把字符串最后的那个‘\0’算进来,而strlen是一个函数,就不需要加入最后的那个‘\0’.
不同的编译器下,各种数据类型所占的字节数,主要是指针类型和long系列的类型
32位处理器:
- char :1个字节
- char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器
- short int : 2个字节
- int :4字节
- unsigned int:4字节
- double:8字节
- float:4字节
- long: 4个字节
- unsigned long:4字节
- long long :8字节
64位处理器:
在64位下,主要有改变的有如下几个数据类型:
- char*(即指针变量): 8个字节
- long: 8个字节
- unsigned long: 8个字节
另外,需要注意的是,任意的处理器都是按照4字节编址的,所以需要我们进行字节对齐。具体的对齐方式可以看下面的介绍:
- 数据类型自身的对齐值:char型数据自身对齐值为1字节,short型数据为2字节,int/float型为4字节,double型为8字节。
- 指定对齐值:#pragma pack (value)时的指定对齐值value。
位运算符的使用:使用位运算计算x%8的值:
答案是:x&7,通过分析我们可以知道x%8是等于:x-(x>>3),从中我可以知道x%8就是保留了x的二进制形式的最后三位,所以可以直接通过:x&7实现x%8。