重庆网站网络推广推广,文字logo设计生成器,定制logo,网站备案期间做什么1、C 可执行程序的内存分布
BSS#xff1a;Block Started by Symbol 存放程序中未初始化的全局变量 数据段#xff1a; 存放已初始化的全局变量#xff0c;静态内存分配 代码段#xff1a; 存放执行代码 堆heap#xff1a; 存放运行中动态分配的内存段#xff0c;可扩张或…1、C 可执行程序的内存分布
BSSBlock Started by Symbol 存放程序中未初始化的全局变量 数据段 存放已初始化的全局变量静态内存分配 代码段 存放执行代码 堆heap 存放运行中动态分配的内存段可扩张或缩减 栈stack 存放程序的局部变量在函数被调用时栈还用来传递参数和返回值
2、C编译原理
1、预编译宏展开过程 2、编译inline在此时展开从C代码到汇编语言 3、汇编汇编语言到机器语言 4、链接 引申内联函数和宏 两者都可以节省函数栈的开销提高运行效率。因为函数在运行时需要保持现场和上下文后恢复现场有时间和空间的开销 宏在调用时直接展开更有效率但不能使用私有成员不能调试容易产生二义性 内联函数由编译器展开
3、C extern关键字的作用
加在变量或函数前表明该内容的定义在其他文件中。 extern “C” 提示C编译器按C语言的规则编译函数举例 C生成的动态库.so文件如果按C命名则函数的名称会因为继承等原因变化比如func()会变成func_%20()其他程序调用dlopen动态打开该库时按照func名称会搜索不到相应的函数。
4、static关键字的作用
在全局变量中加static称为静态全局变量有以下特点 在数据段中存放 会被自动初始化成0 在文件之外不可见
另外static修饰函数可以使其成为类的静态成员函数成员变量和类相关和类的对象无关。 及时没有具体对象也能调用类的静态成员函数——单例模式
5、const关键字的作用
主要有四个方面常量、函数输入、函数输出、成员函数都是为了让被修饰的内容受到保护防止意外修改 1、const修饰常量最常用常量不让修改 2、const修饰输入参数 void StringCopy(char dest,const char source)函数体内任何修改source的行为都会报错 3、如果输入参数采用值传递由于函数会在栈中自动产生临时变量的复制拷贝构造函数因此参数不用加const void func(int x)不能用void func(const int x) 4、引用传递比值传递效率高但是缺点是参数可能被修改因此也可以加const修饰 void func(A a) – void func(const A a) 5、用const修饰函数的返回值 如果以指针传递的方式返回且被const修饰则赋值给其他指针变量的时候要求指针也得用const声明 const char * GetString(); char * strGetString();——报错 const char *strGetString();——正确
如果是值传递由于函数会自动复制的关系加const没用
6、const修饰成员函数
任何不会修改数据成员的函数都应声明为const类型 1、在const成员函数中不慎修改了数据成员会报错 2、在const成员函数中不慎调用了其他非const成员函数报错
7、static、const、static const的初始化
1、在类里创建一个const类型变量时不能给他初值 理由编译器必须为const类型变量分配存储空间但类的声明又不占用存储空间 class foo { private: const int a 100;——报错 } 只能在构造函数的初始化列表里初始化 A::A(int a):bb(a)其中bb的声明为 const int bb; 2、static修饰的类成员变量既不能在类定义中初始化也不能在初始化列表里初始化只能在外头 int foo::a100; 3、static const也是在类外初始化
8、C中new和malloc的区别
new是c的操作符malloc是c中的函数 new可以调用构造函数 delete调用析构函数 malloc只是单纯的分配内存不会初始化成员
9、关于C 多态和函数表的关系
多态的定义一个接口多种方法 多态和非多态的区别可以理解为静态编译重载和动态编译虚函数 多态是通过虚函数表来实现的重载在编译时就确定了函数的地址虚函数的运行地址只能在运行过程中才能确定
10、C虚函数与构造、析构函数的关系
1、构造函数不能使虚的 理由存在虚函数的话会存在虚函数表vtable构建的对象会有一个vptr指向虚函数表所以不能把构造函数放虚函数里 2、析构函数一般都是虚的 如果是实的那么当有一个基类指针指向派生类那么析构时只会析构基类的成员造成派生类的成员没有正确释放 只有是虚的才会先在虚函数表中找到派生类再找基类
如果类中有虚函数不管有多少个它派生出来的对象大小都会多4字节是vptr指向虚函数表的指针
11、C 构造函数、拷贝构造函数、赋值函数
1、构造函数、拷贝构造函数 特点都是“无中生有” A a——通过默认构造函数创建一个对象 2、拷贝构造函数 用一个类的对象去初始化另一个对象时 A ba; A b(a); 都使用的拷贝构造函数 浅拷贝复制一个指针指向同一个地址空间 深拷贝在内存中开辟新的空间两个对象独立 拷贝构造函数的声明 A(const A a)
赋值运算函数 A operator(const A a)
Linux技术 1、epoll和select 当一个程序要读两个以上IO时如果使用阻塞式IO那么一个文件描述符阻塞另一个文件描述符有数据却读不出来效率很低。 解决方案有以下几个 1、开一个描述符就起一个线程维护起来比较复杂 2、用非阻塞IO得一直轮询 3、用异步IO通过信号量或者回调触发 4、IO多路复用epoll和select