转到正文

浪淘沙

静观己心,厚积薄发

原文地址: http://itfanr.duapp.com/?p=600

一、预备知识—程序的内存分配

一个由C/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。

2、堆区(heap)   —   一般由程序员分配释放,   若程序员不释放,程序结束时可能由OS回 收   。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域,   未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。   –   程序结束后由系统释放。

4、文字常量区   —常量字符串就是放在这里的。   程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。

二、例子程序 这是一个前辈写的,非常详细

//main.cpp
  int   a   =   0;  // 全局初始化区
  char   *p1;// 全局未初始化区
  main()
  {
  int   b;  // 栈
  char   s[]   =   "abc";  // 栈
  char   *p2;  // 栈
  char   *p3   =   "123456"; //123456\0在常量区,p3在栈上。
  static  int c   =0;// 全局(静态)初始化区
  p1 = (char  *)malloc(10);
  p2 = (char  *)malloc(20);
  //分配得来得10和20字节的区域就在堆区。
  strcpy(p1,"123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"
 // 优化成一个地方。
  }

二、堆和栈的理论知识

2.1申请方式

stack:

由系统自动分配。   例如,声明在函数中一个局部变量   int   b;   系统自动在栈中为b开辟空间

heap:

需要程序员自己申请,并指明大小,在c中malloc函数如p1   =   (char   *)malloc(10);在C++中用new运算符如p2   =   new   char[10];但是注意p1、p2本身是在栈中的。

2.2申请后系统的响应

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

2.3申请大小的限制

栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

2.4申请效率的比较:

栈由系统自动分配,速度较快。但程序员是无法控制的。

堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一块内存,虽然用起来最不方便。但是速度快,也最灵活。

2.5堆和栈中的存储内容

栈:   在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。

2.6存取效率的比较

char   s1[]   =   “aaaaaaaaaaaaaaa”;char   *s2   =   “bbbbbbbbbbbbbbbbb”;

aaaaaaaaaaa是在运行时刻赋值的;而bbbbbbbbbbb是在编译时就确定的;

但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。

比如:

#include
void   main()
{
char   a   =   1;
char   c[]   =   "1234567890";
char   *p   ="1234567890";
a   =   c[1];
a   =   p[1];
return;
}
//对应的汇编代码
10:   a   =   c[1];
00401067   8A   4D   F1   mov   cl,byte   ptr   [ebp-0Fh]
0040106A   88   4D   FC   mov   byte   ptr   [ebp-4],cl
11:   a   =   p[1];
0040106D   8B   55   EC   mov   edx,dword   ptr   [ebp-14h]
00401070   8A   42   01   mov   al,byte   ptr   [edx+1]
00401073   88   45   FC   mov   byte   ptr   [ebp-4],al

第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,再根据edx读取字符,显然慢了。

2.7小结:

堆和栈的区别可以用如下的比喻来看出:

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。

使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由 度大。   (经典!)

参考:

1. http://blog.csdn.net/hairetz/article/details/4141043

原文地址: http://itfanr.duapp.com/?p=600

阅读全文

平时很少使用linux。一直以为只要使用root权限就可以为所欲为,比如,可以使用root修改文件内容等等。但是,今天我却遇到了一个问题。

使用ll 查看文件的权限为 -rw-r–r– 1 root root , 我作为一个root应该可以修改的。但是,无论怎么操作都不行,使用sudo也不行。没治了。

把神叫过来,直接命令后输入 命令:


chattr -i   config.php

ok。

chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,如果Linux内核版本低于2.2,那么许多
功能不能实现。同样-D检查压缩文件中的错误的功能,需要2.5.19以上内核才能支持。另外,通过chattr命令
修改属性能够提高系统的安全 性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var
目录。 lsattr比较简单,只是显示文件的属性。

关于这个命令的相关描述,互联网上已经有很多了,我这就不再累述。

参考:

http://blog.csdn.net/phphot/article/details/4089791   chattr和lsattr命令详解

http://baike.baidu.com/link?url=3eTmgAkeow3x3QqDXwkvQXAMnKaPcuGE4zd42bz8YbSISlgCyfzGBG4UHbSk3TJfIaL-K4AA0yZ9_NbNDMqNtK  chattr

http://linux.chinaitlab.com/command/38018.html  关于chattr 命令使用详解

阅读全文

今天遇到了HOSTS文件无法修改的问题(WIN7)。

处理办法为:在C:\Windows\System32\drivers\etc 目录上 右键 ,执行”管理员取得所有权”操作,执行后即可对HOSTS文件进行操作。

如果右键目录没有“管理员取得所有权”  选项,将下面的代码放在一个文本文件里面,然将该文本文件修改为.reg文件,双击运行,系统提示

reg

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\runas]
@=”管理员取得所有权”
[HKEY_CLASSES_ROOT\*\shell\runas\Command]
@=”cmd.exe /c takeown /f \”%1\” && icacls \”%1\” /grant administrators:F”
[HKEY_CLASSES_ROOT\Directory\shell\runas]
@=”管理员取得所有权”
[HKEY_CLASSES_ROOT\Directory\shell\runas\Command]
@=”cmd.exe /c takeown /f \”%1\” /r /d y && icacls \”%1\” /grant administrators:F /t”
[HKEY_CLASSES_ROOT\exefile\shell\TakeAuthority]
@=”管理员取得所有权”
[HKEY_CLASSES_ROOT\exefile\shell\TakeAuthority\Command]
@=”cmd.exe /c takeown /f \”%1\” && icacls \”%1\” /grant administrators:F”
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell\runas]
@=”管理员取得所有权”
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell\runas\Command]
@=”cmd.exe /c takeown /f \”%1\” && icacls \”%1\” /grant administrators:F”
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\runas]
@=”管理员取得所有权”
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\runas\Command]
@=”cmd.exe /c takeown /f \”%1\” /r /d y && icacls \”%1\” /grant administrators:F /t”
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\exefile\shell\TakeAuthority]
@=”管理员取得所有权”

阅读全文

最近的一个项目现在了“不同浏览器中 Flash 与其他元素发生覆盖时有差异”这个问题。

经过研究发现,原来会死flash插件wmode参数再各个浏览器下表现不同导致的。

解决方法是,将flash的wmode 根据浏览器(IE,ff,chrome浏览器设置为opaque,其他设置为默认值window)不同设置为不同的值

具体情况可以查看 RX8012: 不同浏览器中 Flash 与其他元素发生覆盖时有差异

 

参考:

http://www.111cn.net/cssdiv/163/46293.htm

http://www.w3help.org/zh-cn/causes/RX8012

http://www.cnblogs.com/_franky/archive/2010/11/19/1882055.html

http://blog.sina.com.cn/s/blog_8ee77fe70100zebj.html

http://www.jb51.net/css/103630.html

阅读全文

原文地址:http://www.jb51.net/article/35892.htm


//问题比如:7*0.8 JavaScript算出来就是:5.6000000000000005

//加法函数,用来得到精确的加法结果
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精确结果
function accAdd(arg1, arg2) {
    var r1, r2, m;
    try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
    try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
    m = Math.pow(10, Math.max(r1, r2))
    return (arg1 * m + arg2 * m) / m
}
//用法:
//给Number类型增加一个add方法,调用起来更加方便。
Number.prototype.add = function (arg) {
    return accAdd(arg, this);
}
//如:
var t1 = 6.60;
var t2 = 1.32;
var t3 = 1.2;
var t4 = 1.2;
var t5 = 1.2;
alert(Number(t1).add(Number(t2)).add(Number(t3)).add(Number(t4)).add(Number(t5)));

//减法函数,用来得到精确的减法结果
function Subtr(arg1, arg2) {
    var r1, r2, m, n;
    try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
    try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
    m = Math.pow(10, Math.max(r1, r2));
    //last modify by deeka
    //动态控制精度长度
    n = (r1 >= r2) ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
}

//乘法函数,用来得到精确的乘法结果
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
function accMul(arg1, arg2) {
    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
    try { m += s1.split(".")[1].length } catch (e) { }
    try { m += s2.split(".")[1].length } catch (e) { }
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
}
//用法:
//给Number类型增加一个mul方法,调用起来更加方便。
Number.prototype.mul = function (arg) {
    return accMul(arg, this);
}

//除法函数,用来得到精确的除法结果
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
function accDiv(arg1, arg2) {
    var t1 = 0, t2 = 0, r1, r2;
    try { t1 = arg1.toString().split(".")[1].length } catch (e) { }
    try { t2 = arg2.toString().split(".")[1].length } catch (e) { }
    with (Math) {
        r1 = Number(arg1.toString().replace(".", ""))
        r2 = Number(arg2.toString().replace(".", ""))
    return (r1 / r2) * pow(10, t2 - t1);
    }
}
//用法:
//给Number类型增加一个div方法,调用起来更加方便。

原文地址:http://www.jb51.net/article/35892.htm

阅读全文

原文地址:http://thihy.iteye.com/blog/1867577

网上有很多帖子讨论浮点数的精度问题,其中有如下命题:
  1. 0.2+0.4=0.600 000 000 000 000 1
  2. 0.58*10=5.8,但0.58*100=57.999 999 999 999 990.58*1000=580
 
阅读全文

原文地址:http://www.csdn.net/article/2013-05-08/2815182-javascript-this

其实如果完全掌握了this的工作原理,自然就不会走进这些坑。来看下以下这些情况中的this分别会指向什么:

1.全局代码中的this


alert(x);// 全局变量值为2

全局范围内的this将会指向全局对象,在浏览器中即使window

阅读全文

原文地址:http://thihy.iteye.com/blog/1777065

本文是在学习正则表达式过程中整理的,虽然冠以教程,但实际上应该算是学习笔记。整篇文章需要对正则有一定的理解。。如果有啥写得不对的,或者写得不够清楚的,欢迎大家留言讨论。

概述

正则表达式(Regular Expression)是高效的、便捷的文本处理工具,能够快速查询符合某种规范的文本。

例如:[0-9]{3}可以匹配3位数字,[a-z]{3}则可以匹配3个小写字母。

目前正则表达式被众多工具所支持,比如egrepsedperlrubyJavaC#pythonTcl等,不同的工具下,正在表达式的范式可能会有略微的差别,执行引擎也可能不同。目前,正则引擎主要有:DFA, 传统型NFA, POSIX NFA, DFA/NFA混合。本文主要介绍Java正则表达式,它的引擎属于传统型NFA

Java正则支持Unicode,它在适当的时候,会使用java.lang.Character.codePointAt(CharSequence seq, int index)获取Code Point,而不是char

阅读全文

地址如下:

各自用一句话来概括MVC、MVP、MVVM的差异特点

一次Ajax查错的经历

各大类库的类工厂

我的MVVM框架 v1发布

less源码学习

“计算机之子”的MVVM框架源码学习笔记

[译]JavaScript中的稀疏数组与密集数组

阅读全文

原文地址:http://www.cnblogs.com/rubylouvre/archive/2012/12/15/2818973.html

你有没有对“在复杂的JSON数据结构中查找匹配内容”而烦恼。这里有8种不同的方式可以做到:

JsonSQL

JsonSQL实现了使用SQL select语句在json数据结构中查询的功能。

例子:

jsonsql.query("select * from json.channel.items order by title desc",json);

主页:http://www.trentrichardson.com/jsonsql/

JSONPath

JSONPath就像是针对JSON数据结构的XPath。

例子:

jsonPath( books, '$..book[(@.length-1)]')

主页:http://goessner.net/articles/JsonPath/

jfunk

jFunk允许你检索(很快会加入管理功能)复杂的JSON或Javascript对象。jFunk API的设计几乎与jQuery API类似。它直接复制了jQuery的API,除了那些针对DOM的API。

例子:

Jf("> vegetables > *[color=Orange]",Food).get();

主页:http://code.google.com/p/jfunk/

TaffyDB

你过去有没有注意到Javascript对象的字面值看起来很像记录?如果你把他们包裹在一个数组里面,那么它们看起来有没有像一个数据库表?TaffyDB是一个Javascript库,它提供了强大的数据库功能以实现之前的想法,大大改善了你在Javascript中使用数据的方式。

var kelly = friends({id:2}).first();

主页:http://www.taffydb.com/

linq.js

linq.js——Javascript中的LINQ(译者注:.Net中的概念,见http://msdn.microsoft.com/zh-tw/library/bb397897

例子:

var queryResult2 = Enumerable.From(jsonArray)

.Where("$.user.id < 200")

.OrderBy("$.user.screen_name")

.Select("$.user.screen_name + ':' + $.text")

.ToArray();

主页:http://linqjs.codeplex.com/

主页:http://neue.cc/reference.htm

objeq

objeq是一个简单的库,实现了对POJSO(Plain-Old JavaScript Objects,普通的Javascript对象)的实时查询。

例子:

var res = $objeq(data, "age > 40 && gender == 'female' -> name");

// --> Returns ['Jessica']

主页:https://github.com/agilosoftware/objeq

(译注:它使用了Javascript的property setters,所以它只能工作在较新的浏览器上)

json:select()

使用类CSS选择符来查询JSON。

例子:

.lang:val("Bulgarian") ~ .level

主页:http://jsonselect.org/#tryit

Paul的编程珠玑中的Javascript数组过滤方法
例子:

var a = [1,2,3,4,5,6,7,8,9,10];
// return everything
a.where( "( ) => true" ) ;
//  --> [1,2,3,4,5,6,7,8,9,10]
// return even numbers
a.where( "( n, i ) => n % 2 == 0" ) ;
//  --> [2,4,6,8,10]
// query first 6 products whose category begins with 'con' using extra param and regular expression
 products.where( "( el, i, res, param ) => res.length <= 6 && param.test( el.cat )", /^con/i);
// using customer table data from SQL Server's northwind database...
customers.where( "( el, i, res, param ) => el.country == param", "USA" );

原文地址:http://www.cnblogs.com/rubylouvre/archive/2012/12/15/2818973.html

阅读全文