- 博客(27)
- 收藏
- 关注
原创 【讨论】关于跨平台
跨平台是软件的一个重要指标。一般程序可分为平台无关和平台相关两部分,平台相关部分主要涉及外围设备(如串口、键盘、鼠标、LCD等)和操作系统API(如定时器、互斥锁、文件系统操作、线程操作等)。除了程序本身的跨平台需求外,还有种应用是对目标机的模拟,例如在PC上模拟一些嵌入式平
2011-10-18 16:27:27 1212
原创 【基础】查表法
查表法是将一些事先计算好的结果,存储在常量数组中,运行时节省计算开销。例如,计算字节中位1的个数,int countBits( unsigned char dat ){ static char nBitTab[256] = { 0, 1, 1, 2, 1,
2011-10-18 11:37:44 20723 1
原创 【讨论】简析文件操作
文件操作在程序设计中使用较多,常见操作有打开、读、写、关闭等。本文将讨论文件操作涉及的相关内容,以Linux平台为例。1. 结构 文件操作是应用程序访问文件系统的过程。下面简要讨论文件系统的结构,如图1所示。图1 文件系统结构示意图 应用程序通过文件描述符int fd访问文件,执行文件操作(如系统调用read)时,先从描述符表中找到文件对象,然后
2009-10-29 18:04:00 1946 1
原创 【讨论】简析堆内存
堆内存是程序设计中使用最多的,操作灵活,可分配空间大,但管理麻烦,搞不好还会内存泄露和产生内存碎片。1. 接口 用户空间示意图如下,堆区从数据段尾端开始生长,动态分配普通大小的内存,超大块内存则直接在共享内存区(文件映射区)映射空间。 图1 进程地址空间示意图内核记录了进程堆空间的位置,并提供系统调用brk/sbrk给用户,动态伸缩该空
2009-09-15 18:44:00 2837
原创 【讨论】8位16位32位等内建类型数据操作的比较
//32位机上,8位16位32位操作的效率比较int wordinc (int a){ /* add r0, r0, #1 */ /* movl 8(%ebp), %eax incl %eax */ return a + 1; } short shortinc (short a)
2009-09-15 12:06:00 1473
原创 【讨论】两种循环方式的比较
C语言中两种常用循环方式及对应汇编代码(1) X86汇编83: int sum = 0x10;0040B8E8 mov dword ptr [ebp-4],10h84: for ( int i = 0; i 0040B8EF mov dword ptr [ebp-8],00040B8F6 jmp
2009-09-15 11:56:00 831
原创 【例子】求凸包算法(扫描法)
#include #include #include typedef char V_INT8; // 8 bit signedtypedef unsigned char V_UINT8; // 8 bit unsignedtypedef short V_INT16; // 16 bit signedtypedef unsigned short V_UIN
2009-09-14 18:48:00 1069
原创 【例子】“首次匹配法”动态内存分配的实现
#include #include typedef unsigned int UINT;#define MEM_SIZE (1<<20)UINT memPool[MEM_SIZE];//双向链表struct VListHead { VListHead() { initListHead(); } void addListNext(
2009-09-14 18:45:00 1501 1
原创 【讨论】有符号数和无符号数运算效率
#include #include #include #include "VTimetest.h"int TIMES = 9999;int main(int argc, char* argv[]){ int j; scanf( "%d", &j ); Timetest t; t.StartTime(); for ( int i = 1; i { j = j / i; }
2009-09-14 18:34:00 2907
原创 【例子】堆栈中运行程序
#include#includetypedef int (*PFunc0)(const char*,...);void test(){ PFunc0 pf = printf; pf("test/n");// printf("1"); //栈上直接调用函数会出错,用函数指针正常。应该是相对偏移和绝对偏移的原因。}typedef void (*PFunc
2009-09-14 18:23:00 834
原创 【讨论】文件操作的原子性
#include #include #include #include #include #include #include #include const char *fileName = "/dev/sram-mmap"; //"test"#define SleepMs( ms ) ( usleep( (ms)*1000 ) )#define T
2009-09-14 18:19:00 2521 1
原创 【讨论】malloc的可重入性和线程安全性
#include #include #include #include #include #include #include #define TRUE 1#define FALSE 0int GP[10];int num = 10;pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER;
2009-09-14 18:08:00 8758 4
原创 【讨论】关于堆栈提交页面与保留页面
线程的堆栈大小有上限值。线程创建时,系统会在进程地址空间的堆栈区,给线程预留这个大小的空间。 线程初始运行时,只提交了少量的页面(即大部分地址空间没有映射,作为保留页面)。 随着栈的深入,初始提交的页面不够用,就要扩充堆栈。 扩充堆栈只要将相邻页面,加入到进程的虚拟地址空间,并映射物理页面。 由于堆栈的访问具有空间局部性,所以系统根据缺页的地址和当前提交页面的距离来
2009-09-14 17:55:00 3320
原创 【基础】关于Linux平台malloc的写时拷贝(延迟分配)
Linux内核定义了“零页面”(内容全为0的一个物理页,且物理地址固定),应用层的内存分配请求,如栈扩展、堆分配、静态分配等,分配线性地址后,就将页表项条目指向“零页面”(指定初始值的情况除外),这样“零页面”就被所有进程共享,当向页面执行写入操作时,内核就会新分配一个物理页,实行“写时拷贝”操作,这样就实现了物理页面的延迟分配(如果只有读没有写,则无需另分配物理页)。动态内存通过glib
2009-09-14 17:26:00 4367
原创 【基础】关于栈内存分布的测试
int main(){ int arr[1]; arr[32] = 1; //访问到栈底// arr[33] = 1; //出错,Access Violation arr[-3039] = 2; //可直接访问的最顶栈空间(可见第一次分配的栈空间是3039+32+1= 3072 DWORD, //即12KB,3个页面大小),索引换成-3040则出错(A
2009-09-14 16:45:00 999 3
原创 【基础】程序中遇到的一个小陷阱
typedef unsigned int UINT;#define SetBlockHeadSize(pInfo, dwords) ( (*(pInfo) &= 0x3 ) |= ( (dwords)#define GetBlockHeadSize(pInfo) ( *(pInfo) >> 2 ) //返回DWORD数int main(int argc, char* ar
2006-11-16 15:49:00 1051
原创 【基础】关于const写保护
const int x = 0;int main(){ const int y = 0; *(int*)&x = 1; //Fail *(int*)&y = 1; //OK return 0;}//*(int*)&x = 1; 访问失败,因为链接器把x放在可执行文件的常量数据段中,这里const起到了写保护的作用;//*(int*)&
2006-11-12 15:23:00 1052
原创 【讨论】++int是否为原子操作
测试代码如下:#include stdio.h>#include pthread.h>#define TIMES 999999U#define THR_MAX 6unsigned int counts = 0;void *thrdFunc(void*)...{ for ( int i=0;i TIMES; ++i ) ...{ ++counts;
2006-11-06 22:18:00 3604 1
原创 【例子】线程安全的共享缓冲队列
#include #include #include typedef int V_INT32;typedef unsigned int V_UINT32;struct VQueueIdx{...}{ VQueueIdx(): idx_new( 0 ), idx_old( 0 ) {} void resetInfo() {..
2006-11-06 20:50:00 2630
原创 【例子】堆缓冲区溢出
#include #include #include void h(void){...}{ printf("h ");}void g(int para){...}{ int arr[128]; int *tmp = (int*)malloc(4); int* buf1 = (int*)malloc(4); int* buf2 = (int*)mal
2006-11-04 08:33:00 1243
原创 【例子】一个小益智游戏(过河游戏)的求解
问题如下:一对父母带着2个女儿和2个儿子,一个警察带着一个小偷,他们都要过河去对岸。只有一条船,每次最多只能乘坐2个人,并且只有爸爸、妈妈、警察可以开船。小偷不能在离开警察的情况下和其他人在一起;儿子不能在没有爸爸的情况下和妈妈在一起;女儿不能在没有妈妈的情况下和爸爸在一起。递归法实现如下:#include #define TRUE 1#define FALSE 0clas
2006-09-01 23:27:00 8362
原创 【效率】整数平方根算法的效率比较
typedef unsigned int V_UINT32;typedef int V_INT32;V_UINT32 VSqrt1( V_UINT32 x ) //简单二分查找{ V_UINT32 a = 1, b = ( x >> 5) + 8, m; if ( b > 65535 ) b = 65535; do { m = ( a + b ) >> 1; if ( m*m
2006-09-01 14:13:00 1933
原创 【基础】关于数组与多态不能合用的一个实例
#include using namespace std;//一组标记函数void funT(){ cout}void funA(){ cout}void funB(){ cout}void funC(){ cout} typedef void ( *pVf )();pVf exPf[4] = { &funT, &funA,&funB,&funC}; class CT{public: C
2006-08-25 19:41:00 1040
原创 【随想】关于【编译期确定与运行期确定】和【静态内存与动态内存】
在用户程序中,堆空间分配动态内存,栈空间分配的相对来说是静态内存;数据段和代码段属于静态内存,堆和栈相对来说都是动态内存;内核中的静态变量和代码属于静态内存,整个用户程序相对来说都是动态内存。///////////////////////////////////////////////////同理:常数值在编译时就确定,变量值要到运行时才确定;局部变量相对于栈基址的偏移,编
2006-08-25 17:25:00 1277
原创 【基础】函数运行栈与调用栈的理解
示例程序:void h(){ printf( "h/n" );}void g(int){ int iData; (&iData)[3] = (&iData)[2]+3; (&iData)[2] = (int)h; printf( "g/n" );}int main(void){ g(0); printf( "main/n" ); return 0;}//运行结果(VC):g
2006-08-25 17:19:00 1183
转载 【基础】一个指针的例子(推荐)
是从网上看到的一个例子:struct S{ int i; int * p;};void main(){ struct S s; int * p = &s.i; p[0] = 4; p[1] = 3; s.p = p; s.p[1] = 1; s.p[0] = 2;}问程序会在哪一行死掉~
2006-08-24 15:10:00 1159 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人