C语言的内存布局
1、栈区:向下增长,由编译器自动分配释放;存放环境变量、形参、返回值。
2、堆区:向上增长,手动分配释放(malloc/free)。
3、数据段:未初始化的静态数据(.bss)、已初始化的静态数据(.data)、常量(.rodata)。
4、代码段:用户代码(.text)、系统初始化代码(.init)。
define与内联的区别
1、宏函数是在编译阶段处理,是纯字符串替换;
内联函数是运行阶段处理,是函数逻辑替换;
2、宏函数无法调试;
内联函数可以调试;
3、宏函数没有返回值;
内联函数有返回值;
4、宏函数不能访问类成员;
内联函数可以访问类成员;
C语言函数的4种调用约定
1、__cdecl C/C++ 缺省调用约定
(1)压栈顺序:从右到左。
(2)参数栈维护:由调用函数把参数弹出栈, 传送参数的内存栈由调用函数来维护。
2、__stdcall调用约定
(1)压栈顺序:从右到左。
(2)参数栈维护:被调用函数把参数弹出栈(在退出时清空堆栈)。
(3)函数修饰名约定:函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。
3、__fastcall (快速调用约定,通过寄存器来传送参数)
(1)压栈顺序:用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送。
(2)参数栈维护:被调用函数在返回前清理传送参数的内存栈。
4、thiscall (本身调用,仅用于“C++”成员函数)
(1)压栈顺序:this指针存放于CX/ECX寄存器中,参数从右到左的压栈顺序。
(2)thiscall不是关键词,因此不能被程序员指定,只能用于C++成员函数。
全局变量和局部变量区别
(1)作用域:全局变量的作用域是整个程序,可以在程序的任何地方访问;局部变量的作用域只限于定义它的函数或代码块内部。
(2)生命周期:全局变量的生命周期是整个程序的运行期间;局部变量的生命周期只在其所在的函数或代码块执行期间。
(3)存储位置:全局变量存储在静态存储区,在程序启动时被分配内存并在程序结束时释放;局部变量通常存储在栈上,随函数的执行而动态分配和释放内存。
(4)默认值:全局变量如果没有被初始化,默认值为0;局部变量如果没有被初始化,值是未定义的。
define和typedef的区别
(1)用法不同:typedef 用来定义一种数据类型的别名,增强程序的可读性。define 主要用来定义常量,以及书
写复杂和频繁使用的宏。
(2)执行时间不同:typedef 是编译过程的一部分,有类型检查的功能。define 是宏定义,是预编译的部分,其
发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。
(3)作用域不同:typedef 有作用域限定。define 不受作用域约束,只要是在 define 声明后的引用都是正确
的。
(4)对指针的操作不同:typedef 和 define 定义的指针时有很大的区别。
(5)typedef 定义是语句,因为句尾要加上分号。而 define不是语句,句尾不加分号