您的位置:首页 > 编程语言 > C语言/C++

C++ 牛客网做题笔记【300题总结】

2017-04-13 09:03 239 查看
1:fork函数复制时将父进程的所有资源都通过复制数据结构进行了复制,然后传给子进程,所以fork函数不带参数。fork()是全部复制,vfork()是共享内存。

clone()是可以将父进程资源有选择地复制给子进程,而没有复制的数据结构则通过指针的复制让子进程共享,具体要复制哪些资源给子进程,由参数列表中的clone_flags来决定。另外,clone()返回的是子进程的pid。

clone是fork的升级版本,不仅可以创建进程或者线程,还可以指定创建新的命名空间(namespace)、有选择的继承父进程的内存、甚至可以将创建出来的进程变成父进程的兄弟进程等等

2:int a(5) 就相当于 int a = 5

3:若想引用一个已经定义过的全局变量,需要使用extern关键字方式

4:多线程调用时,主要是针对全局变量和静态变量的保护,函数内部的局部变量不会受到影响,因为每个线程都有一个栈以保护自己的局部变量

5:read()函数是UNIX或类UNIX系统的系统函数,无缓冲区,fread()是C库的库函数,有缓冲区。read()是系统调用的:从打开的设备或者文件中读取文件

6:动态绑定中,父类指针访问的虚函数可能是子类中的也可能是基类中的

7:vector为动态数组,插入元素最糟糕的时间复杂度为O(n),set查找,基于树,最糟糕要O(logn),涉及到红黑树,hash_map用hash值映射,为O(1),deque队列,把尾部指针指向下一个位置即可,为O(1)

8:组合类的析构函数中并不需要显式调用其成员对象的析构函数,因为当执行类成员的析构函数时,会自动调用其对应的析构函数

9:类内定义的指针,还没有指向内存,所以在未赋值的情况下使用*p是错误的。在构造函数中,当参数为(int  x)时,为形式参数(方法参数),调用完之后,其内存就释放了,所以若将 p = &x 进行赋值,再返回 *p(取出被释放空间的内存)就会出错,应该使用 p = new
int(x),令该指针指向自己申请的内存空间

10:双引号包含头文件,编译器会从编译选项的指定目录去寻找

11:构造函数中变量的初始化顺序是按照变量的声明顺序来的,而并不是依据初始化列表中的顺序

12:静态分配是指在编译时就能确定大小,由编译器进行分配,所以堆不可以进行静态分配,但是使用alloca()函数可以动态分配栈的内存空间,释放时由编译器自己释放。堆在动态分配时,要申请连续的内存空间,所以会产生内存碎片

13:delete this 只是不可以在析构函数内部,在其他函数的内部也是正常的

14:数字0的ASCII码:48

15:特殊的类内存占用情况:空类,虽然不包含任何信息,但是必须在内存中占有一定空间,否则无法使用这些实例,一般都是1;只有函数的类,只需知道函数的地址即可,而这些函数的地址只与类型有关,与类型的实例无关,编译器不会因为函数在内存中添加任何额外的信息,所以还是1;类中有虚函数,会为该函数生成虚函数表,并在该类的每一个实例中添加一个指向虚函数表的指针,32位的指针为4,64位的指针为8;

16:http://www.baidu.com  这句话单独当作一条语句不会有任何问题,后面是注释,前面是相当于case:的一种标签,public等也是标签~

17:当派生类中含对象成员时,构造函数的执行顺序为:基类->对象成员的构造函数->派生类的构造函数,析构函数执行顺序相反

18:复合赋值运算符的优先级特别低:+=,-=,*=,/=; k *= i+j 等同于 k = k * (i + j)

19:在全局域定义enum,输出x是0,在局部域定义enum,输出x是随机数

20:大端存储和小端存储0x20150810  小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址,从低地址到高地址:20 15 08 10,输出从低地址到高地址 20 15 08 10:。大端(Big-Endian):较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址,从低地址到高地址:10
08 15 20,输出从低地址到高地址 08 10 20 15 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息