- 博客(45)
- 收藏
- 关注
原创 使用内建函数__builtin_expect进行程序优化
我们常常能在代码中看到以下内容# define likely(x) __builtin_expect(!!(x), 1)# define unlikely(x) __builtin_expect(!!(x), 0)为什么呢?有什么作用?可以看的上述源码中采用了内建函数__builtin_expect来进行定义,即 built in function。 __builtin...
2020-02-03 11:03:55
444
原创 C++中的转型操作符
C++中的转型操作符旧式的C转型方式,几乎允许你将任何类型转换为任何其它类型,有其自身的缺陷,表现在以下两方面:1.不能更精确地指明其转型的意图。如将一个pointer-to-base-class-object转型为一个pointer-to-derived-class-object(改变一个对象的类型)和将一个pointer-to-const-object转型为一个pointer-to
2015-07-31 16:23:11
1340
原创 int main(int argc,char* argv[])详解
argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数 命令行后面跟的用户输入的参数,比如: int main(int argc, char* argv[]) { int i; for (i = 0; i i++) cout
2014-05-20 15:46:02
573
原创 C++文件复制方法总结
使用C++标准程序库的输入输出流(I/O Stream)复制文件,存在许多的方法,方法一:逐个字符复制#include std::ifstream input("in",ios::binary);std::ofstream output("out",ios::binary);char ch;while (input.get(ch)) output 注意:
2014-05-20 15:00:51
1512
原创 进程的内存映像(高地址到底地址)
#include #include #include const int const_global = 10; // 常全局变量int init_global = 10; // 初始化全局变量int uninit_global; // 未初始化全局变量int main (int argc, char* argv[]) { const static int const_static =
2014-05-13 11:38:50
671
原创 共享库的使用
#include #include typedef int (*PFUNC_CALC) (int, int);typedef void (*PFUNC_SHOW) (int, char, int, int);int main (void) { void* handle = dlopen ("shared/libmath.so", RTLD_NOW); // if (! handl
2014-05-13 11:37:18
545
原创 不能根据errno为0与否作为判断错误的依据
所有的错误的errno都非零,但是不能根据errno为0与否作为判断错误的依据。大多数函数在成功的情况下并不会将errno置为0。
2014-05-13 11:33:09
1740
原创 通过errno表示错误原因
#include #include #include int main (void) { FILE* fp = fopen ("none", "r"); if (! fp) { printf ("%d\n", errno); printf ("%s\n", strerror (errno)); perror ("打开文件失败"); printf ("打开文件失败了,因为%
2014-05-13 11:28:03
510
原创 关于环境变量
#include #include #include void printenv (void) { printf ("---- 环境变量 ----\n"); extern char** environ; char** env; for (env = environ; env && *env; ++env) printf ("%s\n", *env); printf ("----
2014-05-13 10:57:50
463
原创 UC从错误处理之-通过函数返回值表示错误
#include #include /* 获取文件大小,成功返回文件字节数(>=0), 失败返回-1 */long fsize (const char* path) { FILE* fp = fopen (path, "r"); if (! fp) return -1; fseek (fp, 0, SEEK_END); long size = ftell (fp); fc
2014-05-13 10:53:28
533
原创 UC编程基础
一、共享库-fpic:编译选项,位置为无关码-shared:链接选项,共享库LIBRARY_PATH : 链接器使用的库路径环境变量LD_LIBRARY_PATH : 加载器使用的库路径环境变量静态加载:在链接阶段链接共享库gcc main.c -lmath -L.每次启动a.out程序时,加载器都会加载所需要的共享库动态加载:在运行阶段通过代码动态地加载共享库,并
2014-05-13 10:50:17
1405
原创 经典排序算法
数值算法:解方程、微积分、数值分析 多用在工程设计非数值算法:搜索、排序、拆分、合并 多用在系统 一、线性搜索1.算法1.1从头开始,依次将每一个元素与查找目标进行比较1.2或者找到目标,或者找不到目标2.评估2.1平均时间复杂度:O(N),线性时间2.2对数据没有任何规律性要求 穷举法 二、二分搜索(折半搜索)1.算法1.1假设表中
2014-05-05 11:32:14
715
原创 UC编程
UC主要内容 是 Unix 的系统函数和 Unix 系统的设计和管理机制 内容: 1. Unix Linux 的静态库 和共享库 2.C语言的错误处理 3.环境变量和环境表 4.Unix Linux 的内存管理 5.Unix Linux 的文件操作 6.Unix Linux 的目录操作
2014-05-05 11:12:06
3005
原创 有序二叉树的实现
头文件“bt.h”/* 有序二叉树 */#ifndef _BT_H#define _BT_H#include /* 节点 */typedef struct BsTreeNode { int data; /* 数据 */ struct BsTreeNode* left; /* 左子树 */ struct BsTreeNode* right; /* 右
2014-04-24 17:36:41
1473
原创 单向线性链表的实现
/* * 练习:实现单向线性链表 * list_append() - 追加 * list_size() - 测长 * list_print() - 正向打印 * list_rprint() - 反向打印 * list_reverse() - 逆转 * list_middle() - 中间值 * list_merge() - 将两个有序链表合并为一个有序链表 *
2014-04-24 17:20:48
993
1
原创 老鼠走迷宫
/* 老鼠走迷宫 */#include #include #include #include #include #include #include "sl.h"(见基于链表的堆栈实现)/* 空间字符 */#define SPACE_MOUSE '*' /* 老鼠 */#define SPACE_WAY ' ' /* 通路 */#define SPACE_WALL
2014-04-22 13:39:38
1232
原创 基于链表的堆栈实现
定义函数接口头文件“sl.h”/* 基于链表的堆栈 */#ifndef _SL_H#define _SL_H#include /* 节点 */typedef struct StackNode { int data; /* 数据 */ struct StackNode* next; /* 后指针 */} STACK_NODE;/* 堆
2014-04-22 13:05:47
777
原创 基于数组的队列实现
/* 基于数组的队列 */#ifndef _QA_H#define _QA_H#include /* 队列 */typedef struct Queue { int* arr; /* 数组 */ size_t cap; /* 容量 */ size_t front; /* 前端(弹出) */ size_t rear; /* 后端(压入) */ size_t size
2014-04-21 12:03:40
507
原创 二叉树
1.树型结构的最简模型,每个节点最多有两个字节点2.每棵树只有一个父节点,最多只有两个子节点3.具有递归的结构特征,用递归的方法处理二叉树问题,往往可以使算法得到简化。4.三种遍历序列 前序遍历 -D-L-R 中序遍历 -L-D-R 后序遍历 -L-R-D5.形式术语:根节点 枝节点 叶节点 父节点 子节点
2014-04-20 22:03:57
451
原创 链表
1.地址不连续的节点序列,彼此通过指针相互连接。2.根据不同的结构特作,将链表分为: 1)单向线性链表 2)单向循环链表 3)双向线性链表 4)双向循环链表 5)数组链表 顺序表和链表结合,每个链表指针指向一个数组 6)链表数组 指针数组,每个指针指向一个链表 7)二维链表 由链表组成的链表,每个链表指针又指向链表
2014-04-20 22:02:17
514
原创 数据结构基础知识
一 数据结构基本概念 程序设计=数据结构+算法 1.数据结构是相互之间存在一种或多种特定关系的数据的集合。 逻辑 2.数据结构是计算机存储组织数据的方式。 物理形式 3.数据结构的选择直接影响及三级程序的运行效果(时间复杂度)和存储效率(空间复杂度)。 4.数据结构包括三个基本层次: 抽象层-逻辑结构 结构层-物理结构
2014-04-19 23:07:46
611
原创 联合
联合也是一种数据类型,也可以用来表示多组不同数据之间的关系联合中不同部分数据在内存中占据的位置是重叠的联合使用 union 关键字声明 联合的大小是其中占地最大的一组变量的大小对联合中任何一组数据的修改会影响到其他组可以在程序运行过程中临时创建新变量,这种创建变量的方式叫做动态分配动态分配的变量都存放在堆中为了管理动态分配的变量需要使用几个相关标准函数为了使
2014-04-19 22:59:23
432
原创 结构体
结构体可以用来生成新的数据类型 结构体所生成的新数据类型中可以包含多个不同的部分,每个部分可以使用不同类型的数据结构体仅仅是一种数据类型,它不在内存中占据存储位置,它仅仅描述了多个数据之间的关系使用结构体声明的变量叫结构体变量,它们才真占据存储位置声明结构体时需要使用关键字 struct 结构体声明语句通常放在头文件中结构体声明中的变量声明语句不会分配存储位置,所以不
2014-04-19 22:42:47
609
原创 文件操作、宏
文件操作中使用一个整数记录下一次读写操作的位置,这个整数就叫位置指针位置指针记录从文件头到某个位置之间的距离位置指针的数值会随着文件的读写操作而改变 ftell 函数可以获得位置指针的数值rewind 函数可以把位置指针调整到文件开头fseek 函数可以把位置指针调整到文件中任何位置 SEEK_SET 0 文件开头
2014-04-19 22:38:32
493
原创 string操作、文件操作
程序在内存中是分段落保存的代码段 存放所有语句,在运行是内容不可以修改全局段 用来存放全局变量和静态变量,大小不随着程序的运行而改变栈 采用后进先出的管理方式,大小随着程序的运行不断变化 栈里为每个函数的每次运行分配一个私有的区域 每次函数运行结束后它的私有区域被回收
2014-04-19 22:32:16
606
原创 指针变量
指针变量的操作通常分两步 1.把指针变量和正确的普通变量配对 2.通过指针变量操作普通变量如果在一条语句中声明多个指针变量需要在每个指针变量名前加 * NULL 表示空地址 ,数值是 0 任何变量存储空间的地址都不可能是空地址所有没有配对普通变量的指针变量都应该记录空地址既没有记录有效地址又没有记录空地址的指针叫做野指针程序中不应该出现野指针
2014-04-19 22:24:44
494
原创 递归函数、全局变量、局部变量、静态变量、常量、指针变量
会调用自己的函数叫递归函数如果一个问题可以重复采用,同样的方法拆分,就可以使用递归函数解决这样的问题递归函数编写原则1.在函数中用语句描述出问题的拆分方法2.在函数的开始部分使用分支把不可拆分的情况单独处理(处理完成后应该结束函数)很多问题既可以采用循环方式解决也可以采用递归方式结束采用循环方式解决这种问题的思路叫做递推采用递归函数解决这种问题的思路叫做递归
2014-04-19 22:15:26
1677
原创 函数调用(续)
形式参数是在调用的时候临时创建出来的在函数运行期间形式参数一直可以使用,在函数结束时形式参数被销毁 实际参数和形式参数在内存中占据的是不同的存储位置,任何一个的变化都不会影响另外一个 参数列表为空表示参数个数任意,参数类型任意形参列表为 void 表示没有任何形式参数 数组可以作为函数的形式参数数组形参可以用来代表一组个数未知的数字数组做形参时需要另
2014-04-19 22:11:06
462
原创 函数调用
程序中可以对语句进行分组分组是可以在多个层次上进行的最低层次的分层结果叫函数一个函数中一定包含了多条语句 所有 C 语言程序都是由函数构成的 每个函数有一个名字,使用名字区分不同函 数 每个 C 语言程序中必须包含一个主函数 函数之间会相互协作(一个函数可以委托另 外一个函数完成某个特定的任务)函数之间的协作关系是随着时间变化的两个函数之
2014-04-19 22:03:43
547
原创 数组
数组代表了内存中多个连续的存储位置数组要求每个存储位置所对应的数据类型一样数组有一个名称可以用来代表这个数组数组所对应的每一个存储位置有一个编号(最前边的存储位置编号是0,向后依次递增)这个编号叫做下标下标的有效范围是从 0 开始到存储位置的个数减一为止超过这个范围的下标不能使用 使用循环操作数组中的每一个存储位置可以最大程度体现数组的优势这样可以避免随着数据
2014-04-19 21:55:37
614
原创 条件控制语句
break; 语句可以随时终止整个循环的执行continue 语句可以跳过循环中大括号里面剩下的语句而直接进入下一行假设有如下循环语句 for (1;2 ;3) {4}以上for 语句按照如下分组执行[ 1,2] [4,3,2] [4,3,2] ...后面的每组都一样,第一组特殊正常情况下 for 在两组之间结束标号为 2 的逻辑表达式决定是
2014-04-19 21:09:08
471
原创 移位运算及流程控制语句
移位操作可以把一个数据中的所有二进制位向左或向右移动 n 个位置左移使用符号 右移使用符号 >> 表示符号左边是要操作的数据,右边是移动的位数移位操作不会改变参与计算的数字左移操作右边的空位置上一定补 0 有符号位右移的时候左边的空位置上补符号位如果移位操作过程中没有丢失有效数据则左移 n 相当于乘以 2 的 n 次方,右移 n 位就相当于除以 2 的 n 次方~
2014-04-19 21:06:23
716
原创 进制运算与位运算
不可以在二进制表示形式中使用负号5 0000 0101 -5 1111 1011 取反加一既是补码负数二进制的计算方法是把整数二进制按位求反 再加一 就是补码每个有符号数据类型中首位为 1 其它位都是 0 的二进制表示这个数据类型的最小数采用刚才的计算方法同样可以根据负数的二进制补码计算出相反数的二进制补码任何有符号的二进制数字最左边的数位叫符号位
2014-04-19 21:03:24
548
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人