自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 【讨论】关于跨平台

跨平台是软件的一个重要指标。一般程序可分为平台无关和平台相关两部分,平台相关部分主要涉及外围设备(如串口、键盘、鼠标、LCD等)和操作系统API(如定时器、互斥锁、文件系统操作、线程操作等)。除了程序本身的跨平台需求外,还有种应用是对目标机的模拟,例如在PC上模拟一些嵌入式平

2011-10-18 16:27:27 1211

原创 【基础】查表法

查表法是将一些事先计算好的结果,存储在常量数组中,运行时节省计算开销。例如,计算字节中位1的个数,int countBits( unsigned char dat ){   static char nBitTab[256] = { 0, 1, 1, 2, 1,

2011-10-18 11:37:44 20718 1

原创 【讨论】简析文件操作

   文件操作在程序设计中使用较多,常见操作有打开、读、写、关闭等。本文将讨论文件操作涉及的相关内容,以Linux平台为例。1.  结构   文件操作是应用程序访问文件系统的过程。下面简要讨论文件系统的结构,如图1所示。图1       文件系统结构示意图     应用程序通过文件描述符int fd访问文件,执行文件操作(如系统调用read)时,先从描述符表中找到文件对象,然后

2009-10-29 18:04:00 1941 1

原创 【小结】温故知新

    这几天较空闲,回顾了以前留下的工作日志和记录,温故知新,并列出一些到博客,与大家共享和讨论,不当之处,多谢指正。

2009-09-15 19:08:00 806

原创 【讨论】简析堆内存

    堆内存是程序设计中使用最多的,操作灵活,可分配空间大,但管理麻烦,搞不好还会内存泄露和产生内存碎片。1.  接口       用户空间示意图如下,堆区从数据段尾端开始生长,动态分配普通大小的内存,超大块内存则直接在共享内存区(文件映射区)映射空间。 图1       进程地址空间示意图内核记录了进程堆空间的位置,并提供系统调用brk/sbrk给用户,动态伸缩该空

2009-09-15 18:44:00 2834

原创 【讨论】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 1470

原创 【讨论】两种循环方式的比较

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 828

原创 【例子】求凸包算法(扫描法)

#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 1064

原创 【例子】“首次匹配法”动态内存分配的实现

 #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 1499 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 2900

原创 【例子】堆栈中运行程序

#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 833

原创 【讨论】文件操作的原子性

#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 2518 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 8752 4

原创 【讨论】关于堆栈提交页面与保留页面

线程的堆栈大小有上限值。线程创建时,系统会在进程地址空间的堆栈区,给线程预留这个大小的空间。 线程初始运行时,只提交了少量的页面(即大部分地址空间没有映射,作为保留页面)。 随着栈的深入,初始提交的页面不够用,就要扩充堆栈。 扩充堆栈只要将相邻页面,加入到进程的虚拟地址空间,并映射物理页面。 由于堆栈的访问具有空间局部性,所以系统根据缺页的地址和当前提交页面的距离来

2009-09-14 17:55:00 3313

原创 【基础】关于Linux平台malloc的写时拷贝(延迟分配)

Linux内核定义了“零页面”(内容全为0的一个物理页,且物理地址固定),应用层的内存分配请求,如栈扩展、堆分配、静态分配等,分配线性地址后,就将页表项条目指向“零页面”(指定初始值的情况除外),这样“零页面”就被所有进程共享,当向页面执行写入操作时,内核就会新分配一个物理页,实行“写时拷贝”操作,这样就实现了物理页面的延迟分配(如果只有读没有写,则无需另分配物理页)。动态内存通过glib

2009-09-14 17:26:00 4364

原创 【基础】关于栈内存分布的测试

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 995 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 1048

原创 【基础】关于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 1049

原创 【讨论】++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 3601 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 2622

原创 【例子】堆缓冲区溢出

 #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 1238

原创 【例子】一个小益智游戏(过河游戏)的求解

问题如下:一对父母带着2个女儿和2个儿子,一个警察带着一个小偷,他们都要过河去对岸。只有一条船,每次最多只能乘坐2个人,并且只有爸爸、妈妈、警察可以开船。小偷不能在离开警察的情况下和其他人在一起;儿子不能在没有爸爸的情况下和妈妈在一起;女儿不能在没有妈妈的情况下和爸爸在一起。递归法实现如下:#include #define TRUE 1#define FALSE 0clas

2006-09-01 23:27:00 8358

原创 【效率】整数平方根算法的效率比较

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 1931

原创 【基础】关于数组与多态不能合用的一个实例

 #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 1274

原创 【基础】函数运行栈与调用栈的理解

示例程序: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 1181

转载 【基础】一个指针的例子(推荐)

是从网上看到的一个例子: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 1158 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除