C++后台知识点总结(二)

     本文是我在复习C++后台开发相关知识的时候整理的一些笔记,只是为了以后没事的时候能够翻一翻,回忆一下知识点,如果有什么错误的地方,还请各位大佬指正,谢谢!

1.C/C++ 程序的分区

   C和C++程序的内存分区存在一些差别,此处不做具体区分,只讲解常见的一些知识。

  (1) 栈区:类似于数据结构的栈,主要由编译器进行维护,用于静态分配内存。一般来说,该区域主要存放局部变量、函数调用中的形式参数(本质上也是局部变量),数据的存取遵循先进后出的规律(LIFO)。另外,不同操作系统的栈区生长方向不同,Linux系统的栈区是从高地址往低地址生长,而Windows系统的展区则相反。

  (2) 堆区:内存区域的堆与数据结构的堆不同,这里的堆主要用于程序中动态分配内存,堆区内存的分配和释放一般由程序员编写程序负责,在C++程序中可以通过new/delete 或者malloc/free 分配和释放动态内存。另外,如果程序没有释放动态分配的内存,就会造成内存泄漏,这些内存可能会由操作系统回收,也可能不会被回收,因而程序中最好保证动态分配的内存能够被及时回收。

  (3) 全局存储区:与静态存储区是一样的,在C/C++程序中,全局变量和静态变量存储在同一区域,已经初始化的全局变量和静态变量会存放在一块区域,而未初始化的全局变量和静态变量则存储在相邻的另一块区域中。

  (4) 程序区:存放编译生成的可执行文件内部的二进制代码。

2. C/C++ 程序的内存模型

   根据C/C++程序中对象生命周期不同,c/c++的内存模型有三种不同的内存区域,即:自由存储区,动态区、静态区。

   自由存储区:主要存储非静态局部变量,即平常经常说的栈区。

   动态区:主要存储使用new构造的对象和malloc分配的内存,即平常所说的堆区。

   静态区:全局变量,静态变量,字符串常量存在的位置。

  注意:虽然编译生成的二进制代码占据内存空间,但是该区域不属于C/C++程序的内存模型。

 3. C++ 程序中如何调用C语言代码?

    C++语言支持函数重载机制,而C语言不支持,两者的函数在编译之后在符号库中存储的符号不同,因此C++程序不能直接调用C语言写的函数。如果要实现在C++程序中调用C语言编写的代码,需要使用extern "C" 链接指定符来解决名称匹配问题。使用格式如下:

#ifdef __cplusplus 
extern "C" { 
#endif

//一段代码

#ifdef __cplusplus 
} 
#endif

 

  4. I/O模型和I/O多路复用机制

     在网络编程中我们经常会接触到I/O, 例如读写套接字获取数据,读写文件等,很多时候我们都是使用操作系统提供的I/O系统调用来实现读写机制。在实际开发过程中,我们使用I/O机制进行读写主要是通过I/O模型来实现的,常见的I/O模型主要有以下四种:同步阻塞IO、同步非阻塞IO、异步阻塞IO、异步非阻塞IO。这四种方式的实现原理有所不同,都可以用在服务器编程模型中。

      I/O多路复用机制属于上面I/O模型中的异步阻塞IO模型,具有较高性能,因此在服务端编程中经常使用。I/O多路复用机制是指一种可以把多个I/O的阻塞复用到同一个select、poll或epoll的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求的机制。与传统的多线程/多进程模型比,I/O多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程。

      目前主流操作系统都提供了相应的I/O复用机制,如Unix系统的select、poll函数,Linux系统的epoll等,实际上这三个函数的使用本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

     有关select,poll,epoll函数的具体原理可以参考以下博客:

    https://blog.csdn.net/will130/article/details/51072819

5. C/C++程序中的变量存储类型有哪些?

    C/C++语言中的存储类型有auto, extern, register, static 四种,它们分别代表了不同存储属性的变量。

    auto变量:自动变量,一般来说在函数内部定义的局部变量和全局变量默认都是auto变量。

    extern变量:表示外部变量,用于在一个文件中引用其他文件定义的变量时变量的声明,编译器在处理该语句时会自动查找其他文件是否      有该变量,也可以用于声明外部函数。

    register变量:用于声明具有寄存器属性的变量,用的较少。

    static变量:用于声明静态变量,使用该关键字定义的变量存储在内存中的静态存储区,全局可访问,并且只保存一份实例。

6. 其他复习资料

    https://blog.csdn.net/Xiongchao99/article/details/74524807?locationNum=6&fps=1

    https://blog.csdn.net/ccf19881030/article/details/14088271

    未完待续......................

      

 

posted @ 2019-01-17 00:04  晴天Jay_chen  阅读(402)  评论(0)    收藏  举报