![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
计算机程序设计
RichardXu
永不放弃 耕者生存
展开
-
内存管理算法介绍
内存是计算机系统中除了处理器以外最为重要的资源,任何一个程序的运行都离不开内存资源的有效使用。前面两小节介绍了硬件支持的内存管理机制,尤其是如何将虚拟地址或者逻辑地址转译成物理内存地址。这一节我们将首先讨论在一个地址空间内部如何有效地进行动态内存管理,然后介绍常用的页面替换算法,以及在进程内存管理中常常用到的工作集概念和相应的算法。 假设操作系统或者一个进程已经获得了一块转载 2015-01-09 18:42:06 · 9570 阅读 · 0 评论 -
undefined reference to `ceil' (or pow or floor or ...) in ubuntu 11.10
There has been a change to the build tools in ubuntu 11.10 - The "--as-needed" flag is now passed to the linker. This primarily has implications for dynamic library linking but it also affects the ord转载 2012-11-07 11:43:54 · 3609 阅读 · 0 评论 -
Zend引擎中对HashTable的各种操作
一边学习C,一边研究Zend引擎,边学习边总结。HashTable的初始化:ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC){原创 2012-06-28 11:30:19 · 2441 阅读 · 0 评论 -
C语言#pragma预处理
在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma 指令对每个编译器给出了一个方法,在保持与C 和C ++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。 其格式一般为: #pragma para 其中para 为参数转载 2012-06-28 12:47:50 · 1575 阅读 · 0 评论 -
C语言中main()函数不要返回结构体类型(求助)
大家先看一下这段程序:#include typedef unsigned char bool;typedef struct _person person;struct _person { bool sex;};person main() { person xingwang; xingwang.sex = 0; return xingwan原创 2012-07-05 11:31:09 · 2422 阅读 · 1 评论 -
C语言中指针类型的用途总结
一、指针变量作为参数void set_time(int *time);void set_time_copy(int time);void main(){ int *ptr, time; ptr = &time; int time_copy = 3; time = 3; set_time(ptr); set_time_copy(time_原创 2012-06-20 15:32:09 · 2526 阅读 · 0 评论 -
GNU Assembler 伪指令
.align boundary [,filler][,maximum] 在当前位置插入filler所指定的值并且地址对齐与指定的边界。这3个值都是绝对数。如果filler没有指定,则数据段中默认填充0,指令段中默认填充noop操作码。如果指定maximum,表示最多填充filler的数量,如果这个的值加上当前地址大于当前第一个边界,则只填充到第一个边界。如果小于当前第一个边界,则忽略这个伪转载 2012-07-04 14:16:03 · 2795 阅读 · 0 评论 -
typedef用法小结
第一、四个用途用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量;以下则可行:typedef char* PCHAR; // 一般用大写PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针虽然:转载 2012-06-21 11:08:26 · 815 阅读 · 0 评论 -
汇编语言中断类型
0H 除以零 1H 单步(用于DEBUG) 2H 非屏蔽中断 3H 断点指令(用于DEBUG) 4H 溢出 5H 打印屏幕 6H 保留 7H 保留 8259中断向量 8H 定时器 9H 键盘 AH 彩色/图形 BH 异步通讯(secondary) CH 异步通讯(primary) DH 硬磁盘 EH 软磁盘 FH 并行打印机 BI转载 2012-06-20 15:23:32 · 3787 阅读 · 0 评论 -
Difference Between AT&T and Intel Assembly Syntax(AT&T和Intel汇编语法的不同)
译者注:学习汇编语言的时候用的是王爽老师的那本,里面讲的是Intel系统的语法。但是在实际工作中,都是在Linux下研究C,就发现GCC编译后的汇编代码都看不懂。The difference(不同之处)--------------This document is more related to coding than hacking, although assembly is a翻译 2012-07-04 12:14:24 · 2081 阅读 · 0 评论 -
C语言中,bool不是关键字
typedef struct _person person;struct _person { bool sex; char *name; int age; char *work;} xingwang;person main() { xingwang.name = "徐兴旺"; xingwang.age = 25; xingwang.原创 2012-07-04 11:06:26 · 2615 阅读 · 0 评论 -
Linux、DOS、Mac下换行的不同表示
关于回车和换行的历史。回车和换行关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。转载 2012-04-19 15:33:20 · 10122 阅读 · 0 评论 -
关于C语言中内存分配的技巧
在C/C++中,当你尝试访问一个数组的某一元素的时候,不会做任何下标是否越界的检查。如果下标超过了数组定义时候的长度,就会从数组所占空间的最后一个地址一次往后顺延。所以如果数组后面定义了某些元素,这些元素的值可能会改变;如果数组的下标足够大,就会访问到超过程序所拥有的地址空间的地址,会报错:Segmentation fault这样,那个可变长度的结构体也就很好理解了原创 2012-03-08 10:44:34 · 987 阅读 · 0 评论 -
标准输入设备(stdin)怎么输入EOF
打印出EOF这个宏,值为-1。但是如果直接输入 -1 ,系统会认为这是两个字符 - 和 1。查了资料,才明白在Windows下输入Control + D可以得到EOF的值。在这个时候,如果接收输入的变量定义为了Char类型,那么是接收不到这个EOF值得,所以要定义为比Char大的类型,比如Int原创 2012-03-07 19:39:03 · 6806 阅读 · 0 评论 -
x/nfu-用gdb查看内存
用gdb查看内存格式: x /nfu 说明x 是 examine 的缩写n表示要显示的内存单元的个数f表示显示方式, 可取如下值x 按十六进制格式显示变量。d 按十进制格式显示变量。u 按十进制格式显示无符号整型。o 按八进制格式显示变量。t 按二进制格式显示变量。a 按十六进制格式显示变量。i 指令地址格式c 按字符格式显示变量转载 2012-03-06 14:50:28 · 2792 阅读 · 0 评论 -
C/C++语言语言中的声明和定义浅解
声明和定义,Declare 和 Define。很多编写脚本语言的程序员刚接触的时候会比较晕,不知道为什么会有声明的存在。最近了解了一些编译器的东西,才领悟到,声明主要是让编译器将所声明的变量、函数等添加到符号表中,而这些符号实际的地址就交给链接器取完成。所以,在很多个源文件的时候,将函数的声明放在一个头文件中。用到这个函数的时候,只要包含这个头文件,编译器就会认为这个外部变量或者函数存原创 2013-04-11 16:01:23 · 936 阅读 · 0 评论 -
GNU Dynamic Loader search directories
动态链接 RPARH LD_LIBRARY_PATH 查找库文件转载 2013-09-10 11:07:34 · 1309 阅读 · 0 评论 -
C语言当中的逻辑值
在C语言当中,没有布尔类型的数据。在做逻辑判断的时候,TRUE OR FALSE 是用数字来表示的,0 表示 FALSE,其他的都表示 TRUE。原创 2013-09-22 17:58:31 · 2211 阅读 · 0 评论 -
C语言中变长参数实例
C变长参数原创 2014-12-16 14:47:03 · 1093 阅读 · 1 评论 -
Linux中getrusage的使用
Linuxrusagegetrusage翻译 2014-11-05 13:40:14 · 2851 阅读 · 0 评论 -
PHP内核中重要的两个全局变量
PHPZend引擎Zend执行器Zend编译器原创 2014-11-05 11:39:09 · 3307 阅读 · 0 评论 -
GDB在调试Zend引擎时的几个重要的用法
GDB调试Zend引擎原创 2014-11-05 11:42:33 · 1180 阅读 · 0 评论 -
Zend 引擎执行器的核心代码
PHPPHP内核Zend引擎原创 2014-11-05 11:31:24 · 1465 阅读 · 0 评论 -
一张游览PHP内核迷宫的藏宝图
PHPPHP内核Zend引擎原创 2014-10-30 14:06:29 · 1369 阅读 · 0 评论 -
关于PHP中的自增、自减操作的奥秘
PHP自增语句原创 2014-10-08 17:54:18 · 5472 阅读 · 0 评论 -
PHP内核两大流程之启动PHP的核心代码段
PHPZend 引擎PHP启动流程原创 2014-11-09 19:54:56 · 1919 阅读 · 1 评论 -
PHP加载大文件时require和file_get_contents的性能对比
PHPPHP内核requirefile_get_contents大文件原创 2014-11-07 23:33:13 · 4904 阅读 · 2 评论 -
Linux下可执行文件格式详解
Linux可执行文件ELF格式原创 2014-08-21 17:49:31 · 44270 阅读 · 3 评论 -
“段寄存器”的故事
一、 段寄存器的产生段寄存器的产生源于Intel 8086 CPU体系结构中数据总线与地址总线的宽度不一致。数据总线的宽度,也即是ALU(算数逻辑单元)的宽度,平常说一个CPU是“16位”或者“32位”指的就是这个。8086CPU的数据总线是16位。地址总线的宽度不一定要与ALU的宽度相同。因为ALU的宽度是固定的,它受限于当时的工艺水平,当时只能制造出16位的AL转载 2014-02-25 15:10:47 · 900 阅读 · 0 评论 -
深度优先遍历与广度优先遍历算法的C语言实现
深度优先遍历算法(Depth-first-search),重点关注的是图的连通性(connectivity),即从图中给定的一点都能访问到哪些点。不仅如此,在遍历这些点的过程中,通过记录访问次序,可以实现其他功能,比如测试该图是否有闭环等。广度优先遍历算法(Breadth-first-search),是为了寻找两个节点之间的最短路径。如果把图中每一点看作是一个乒乓球,每一条边都用线连起来,那么原创 2013-11-11 11:41:29 · 19273 阅读 · 2 评论 -
归并排序的C语言实现
归并排序的核心思想是 Divide-and-Conquer 算法,即将要解决的size为n的问题,分成a个size为n/b的子问题,这些子问题的结果经过O(n^d)的时间复杂度合并,即可解决最初的问题。所以,这一类的算法,复杂度计算公式为 T(n) = a*T(n/b) + O(n^b)。经过几天的努力,终于将归并排序用C语言实现了出来:mergesort.h:#define BU原创 2013-10-29 11:50:25 · 1462 阅读 · 0 评论 -
C语言当中的作用域
在C语言当中,变量的作用域分为两种:全局变量和局部变量。在所有函数之外声明的变量是全局变量,这些变量可以在整个程序当中被访问;局部变量是在某一对大括号({})之间生命的变量,这些变量在这对大括号之外是不可见得,也就是说被访问的话会提示变量未定义。例子:int var = 10;int main(){ int var = 20; printf("%d", va原创 2013-09-22 18:10:46 · 1128 阅读 · 0 评论 -
程序的链接和装入及Linux下动态链接的实现
链接器和装入器的基本工作原理一个程序要想在内存中运行,除了编译之外还要经过链接和装入这两个步骤。从程序员的角度来看,引入这两个步骤带来的好处就是可以直接在程序中使用printf和errno这种有意义的函数名和变量名,而不用明确指明printf和errno在标准C库中的地址。当转载 2011-08-05 11:25:07 · 1054 阅读 · 0 评论 -
在C/C++项目的开发中,防止头文件被重复加载的措施
在C/C++项目的开发中,为了防止头文件被重复加载,可以采用如下方式来避免。PHP源代码就是这么干的,比如Zend/zend.h中: 22 #ifndef ZEND_H 23 #define ZEND_H代码正文777 #endif /* ZEND_H */原创 2011-08-04 16:55:17 · 1723 阅读 · 0 评论 -
Windows下C中__assume的作用
Microsoft Specific __assume(expression)The __assume keyword passes a hint to the optimizer. The optimizer assumes that the condition r翻译 2011-08-04 17:12:36 · 2791 阅读 · 0 评论 -
C语言实现直接插入排序
#include #include void insert_sort(int *a,int *b,int arr_size){ int buffer,i=0,j=0,m=0,flag; b[0]=a[0]; for(i=1;ib[j]){ for(m=i;m>j;m--){ b[m] = b[m-1]; } b[j] = a[i]; flag = 1; } } if(flag == 0){ b[i] =原创 2010-10-20 11:28:00 · 1311 阅读 · 1 评论 -
C语言实现冒泡排序
<br />#include <stdio.h>#include <stdlib.h>void bubble_sort(int *a, unsigned int arr_size);int main(){ int *a; unsigned int n,m,k; printf("%s","请输入数组的个数:"); scanf("%d",&n); a = malloc(sizeof(int)*n);原创 2010-10-20 15:30:00 · 868 阅读 · 0 评论 -
C语言void及void指针深层探索
<br /> 1.概述<br /> 本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。<br /> 2.void的含义<br /> void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。<br /> void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:<br /> void a;<br /> 这行语句编译时会出错,提示“illegal use of type '转载 2010-10-05 00:38:00 · 545 阅读 · 0 评论 -
sscanf和sprintf
sscanf和sprintf是scanf和printf家族的一对成员,用于处理和分析字符串非常强大得两个函数头文件 stdio.h原型int sscanf( const char *buffer, const char *format, ... );int sprintf( char *buffer, const char *转载 2010-09-23 11:30:00 · 618 阅读 · 0 评论 -
程序复杂度
<br />1、时间复杂度<br /> (1)时间频度 <br /> 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 <br /> (2)时间复杂度 <br /> 在刚才提到的时间频度中,n称为问题的规模,当n不转载 2010-09-19 11:35:00 · 1256 阅读 · 0 评论