C
lcxhjg
这个作者很懒,什么都没留下…
展开
-
C/C++中extern关键字详解
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。 也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数转载 2014-02-19 13:04:53 · 383 阅读 · 0 评论 -
关键字inline的作用
1. 作为函数定义的关键字,说明该函数是内联函数。内联函数会将代码块嵌入到每个调用该函数的地方。内联函数减少了函数的调用,使代码执行的效力提高,但是会增加目标代码的大小,最终会使程序的代码段占有大量的内存。2. Inline不是强制的,编译器可以对它置之不理。例如,递归函数通常不会被编译为inline函数,编译器有权决定是否将声明为inline的函数编译为inline....原创 2018-07-05 13:58:15 · 8018 阅读 · 0 评论 -
关键字volatile的使用
1. 说明该变量是易变的,编译器不会对这个值作优化,而是直接访问该值。原创 2018-07-05 13:58:45 · 81 阅读 · 0 评论 -
进程中的内存管理
.1 一个进程运行时,所占用的内存分为几个部分:.1.1 堆段:由编译器自动分配和释放,用来存放函数的参数,局部变量等。 l 程序调用malloc申请内存的流程 l 对于堆的管理,内核提供了两个系统调用brk和mmap。brk 用于更改堆顶地址,mmap则为进程分配虚拟地址空间。 l 详细介绍请...原创 2018-07-05 14:04:34 · 360 阅读 · 0 评论 -
堆内存的管理
1.1 对于堆的管理,内核提供了两个系统调用brk和mmap。brk 用于更改堆顶地址,mmap则为进程分配虚拟地址空间。1.2 当进程向glibc申请内存时,如果申请的内存的数量大于阀值的时候,glibc会采用mmap为进程分配一块虚拟地址空间,而不是采用brk来扩展栈顶的指针。1.2.1 上述“阀值”缺省情况是128K,这个值可以通过函数来设置:int m...原创 2018-07-05 14:05:33 · 792 阅读 · 0 评论 -
栈内存管理
.1 栈内存申请:栈需要多少空间就给多少空间,不需要通过系统调用去扩展栈顶指针。当进程采取压栈动作后,栈顶指针减少,如果进程访问相应内存时会触发页故障,触发linux内核扩展栈所在的内存空间。由于不涉及系统调用,所以栈段内存的扩展要比对内存扩展更加方便、快捷。.2 Linux 系统中进程栈段所使用的物理内存是只能增长不会减少的,其大小等于其在运行过程...原创 2018-07-05 14:07:00 · 868 阅读 · 0 评论 -
内存对齐
1 为什么要设置内存对齐1.1 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。1.2 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。2 ...原创 2018-07-05 14:08:13 · 101 阅读 · 0 评论 -
位域
1. 位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。 所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。位域在本质上就是一种结构类型,...原创 2018-07-05 14:11:57 · 153 阅读 · 0 评论 -
函数memcpy, memmove 和memccpy的区别
这三个函数的功能均是将某个内存块复制到另一个内存块。前两个函数的区别在于它们处理内存区域重叠(overlapping)的方式不同。第三个函数的功能也是复制内存,但是如果遇到某个特定值时立即停止复制。对于库函数来说,由于没有办法知道传递给他的内存区域的情况,所以应该使用memmove()函数。通过这个函数,可以保证不会出现任何内存块重叠问题。而对于应用程序来说,因为代码“知道”两个内存块不会重叠,所...原创 2018-07-05 14:12:41 · 638 阅读 · 0 评论 -
函数参数入/出栈顺序
1 入栈1.1 入栈内容1.1.1 函数参数1.1.2 函数返回地址1.1.3 …1.2 参数入栈顺序1.2.1 参数从右到左入栈1.2.2 原因1.2.2.1 支持可变长参数1.2.2.2 C语言中调用约定所采用的方式 1.3 反汇编检查1.3.1 如下图,进栈的顺序是0x12c(30...原创 2018-07-06 11:20:00 · 960 阅读 · 0 评论 -
工具使用
Gcc1. https://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/https://gcc.gnu.org/onlinedocs/http://www.bnikolic.co.uk/blog/http://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/book1....原创 2018-07-06 11:31:15 · 277 阅读 · 0 评论 -
关键字static的使用
1. static 局部变量1.1 把局部变量改变为静态变量后是改变了它的存储方式,也改变了它的生存期;1.2 static局部变量只被初始化一次,下一次访问该变量,其保留上一次的结果值;2. static全局变量2.1 全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。2.2 ...原创 2018-07-05 13:57:30 · 79 阅读 · 0 评论 -
关键字extern的使用
函数 声明该函数可以被外部模块调用。变量 放在变量前,用来声明一个变量,说明该变量已经在其它地方定义,如:extern int i; 该变量的定义可以是: 该变量可以是在其它.c中定义的全局变量。 该变量可以是在同一个.c中定义的全局变量,但是是在引用该变量之后定义的,则在使用该变量时需要使用extern声明该变量。 变量只能是...原创 2018-07-05 13:54:31 · 119 阅读 · 0 评论 -
函数和宏的区别
1. 宏在编译时在调用该宏的地方展开,最终嵌入到调用的代码中;函数在编译阶段在程序中会有固定代码段(非inline函数),执行到调用函数的地方会调转到该函数段继续执行。2. 在程序代码中多次使用宏,则最终代码会有多个该宏代码的多次拷贝;函数(非inline函数)则在代码中只有一个代码段,多次调用只会调转到该代码段执行。3. 宏不会产生函数调用,执行效率高;...原创 2018-07-04 14:16:15 · 280 阅读 · 0 评论 -
C语言基本概念
位(bit)原创 2018-07-04 11:21:20 · 420 阅读 · 0 评论 -
字节序
概念什么是字节序 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。小端字节序/低端字节序 把低有效位放在存储器的低地址端,高有效位放在存储器的高地址端。 如:在按字节寻址的存储器中往地址 0x0000 存放值 0x12345678,在存储器中的数据为: 地址 数值 0x0000 0x78 0x0001 ...原创 2018-07-04 11:47:04 · 201 阅读 · 0 评论 -
不同机器上变量的大小(x86)
变量 定义 大小(32 bit) 大小(64 bit) char char ch; 1 1 int int num; 4 4 float float f; 4 double double d; 8 long long l; 4 long long long long ll; 8 char数组 char ch[8]; 8 8 char指...原创 2018-07-04 12:02:31 · 202 阅读 · 0 评论 -
float/double类型变量的存储方式
种类-------符号位----------------------指数位-------------------尾数位float-------第31位(占1bit)---第30-23位(占8bit)----第22-0位(占23bit)如:8.25(十进制) ==> 1.00001 * 23,内存分布如下:double-------第63位(占1bit)---第62-52位(占11bit)-...原创 2018-07-04 12:07:52 · 1916 阅读 · 0 评论 -
不同类型的变量和0值的比较
整型 将整型变量用“==”或“!=”直接与 0比较。{ int value; if (0 == value) { } if ( 0 != value) { }}指针型 应当将指针变量用“==”或“!=”与 NULL比较。指针变量的零值是“空” (记为 NULL) 。尽管 NULL 的值与 0 相同,但是两者意义不同。{ void* ...原创 2018-07-04 13:39:29 · 339 阅读 · 0 评论 -
数据类型的优先级(隐式转换时使用)
算术运算式中,低类型转换为高类型。转换以占用内存空间最大的类型为标准,将其他较小的类型转换为较大的类型,以保证精度不降低。如int型和long型运算时,先把int量转换成long型后再进行运算。所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。char型和short型参与运算时,必须先转换成int型。赋值表达式中,右边表达式的值自动隐式...原创 2018-07-04 13:44:11 · 4909 阅读 · 0 评论 -
运算符的优先级
C语言运算符优先级(供参考,待验证)优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 -- () 圆括号 (表达式)/函数名(形参表) -- . 成员选择(对象) 对象.成员名 -- -> 成员选择(指针) 对象指针->成员名 -- 2 - 负号运算符 -表达式 ?右到左 单目运算...原创 2018-07-04 13:46:54 · 663 阅读 · 0 评论 -
不同类型指针的++, --操作
一般数据类型指针char ch[16]; char *p = ch; p++; //p++后,p指向ch[1];int num[8]; int *p = num;p++; //p++后,p指向num[1];指向多维数组的指针 char ch[3][16]; char (*p)[16] =ch; p++; //p++后,p指向ch[1][0];总结: ++, --的跳转的单位是其指向的...原创 2018-07-04 13:49:14 · 821 阅读 · 0 评论 -
不同数据类型的sizeof
1. 一般数据类型1.1 char ch[16]; int ret =sizeof(ch); //ret = 161.2 int num[8]; int ret =sizeof(num); //ret = 321.3 char ch[5][16]; int ret =sizeof(ch); //ret = 801.4 ...原创 2018-07-04 13:50:40 · 260 阅读 · 0 评论 -
include的区别
1. #include <xxx.h>: 通常用于标准或系统提供的头文件,编译器会在系统指定的目录中查找头文件。2. #include “xxx.h”: 用于用户自己定义的头文件,编译器首先在用户工作目录中查找,如果查找不到,则会在编译器安装的目录中查找(针对VC),最会会在系统目录中查找头文件。...原创 2018-07-04 14:15:42 · 135 阅读 · 0 评论 -
区别wchar_t,char,WCHAR
转至:http://www.360doc.com/content/12/0807/01/9290626_228750141.shtml1.区别wchar_t,char,WCHAR ANSI:即 char,可用字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数。 UNICODE:wchar_t是Unicode字符的数据类型,它实际定义在里: t...转载 2019-01-10 09:31:52 · 5902 阅读 · 0 评论