易截截图软件、单文件、免安装、纯绿色、仅160KB
热门标签: c c# c++ asp asp.net linux php jsp java vb Python Ruby mysql sql access Sqlite sqlserver delphi javascript Oracle ajax wap mssql html css flash flex dreamweaver xml
 最新文章 : c++

java快 还是 c快[c++快],似是而非的谈

    首先说明一下这个”快”的含义,我想以前那些讨论这个话题的人当然认为这个快是指程序的运行速度,至于”软件开发速度”恐怕想也没想,或许认为软件开发速度和这个话题扯不上一点关系.那么这个问题在网上搜搜,搜的一大堆,那些c/c++阵营的列了很多例子来说明c/c++快, java阵营的也是如此,还提供一些机构的数据来说明java并不慢.可是仍然没有让大家都信服的理由或者结果.从这些讨论中我们应该得到一些启示,那就是讨论这个话题的前提是讨论的人必须既对java有很深的了解还要对c/c++有很深入的接触,否则都是偏面的.
    另外从网上的结果看大家都谈到了一个共同点,编译的方式或机制是对速度是有影响的.在这里提到了java的动态编译的问题JIT(just in time).很明显很多c/c++程序员他不了解java的运行机制,java的动态编译是这样描述的,首先写完一个helloworld.java的源文件交由java compiler得到helloworld .class文件,java.exe会启动Java Virtual Machine,并加载这个class文件通过JIT编译为本机的机器代码.特别要强调的是这个class文件,它是编译原理中所谓的中间代码,它并不是目标代码.也正因为有了这个中间代码才使动态编译得 ......

java快 还是 c快[c++快],似是而非的谈

    首先说明一下这个”快”的含义,我想以前那些讨论这个话题的人当然认为这个快是指程序的运行速度,至于”软件开发速度”恐怕想也没想,或许认为软件开发速度和这个话题扯不上一点关系.那么这个问题在网上搜搜,搜的一大堆,那些c/c++阵营的列了很多例子来说明c/c++快, java阵营的也是如此,还提供一些机构的数据来说明java并不慢.可是仍然没有让大家都信服的理由或者结果.从这些讨论中我们应该得到一些启示,那就是讨论这个话题的前提是讨论的人必须既对java有很深的了解还要对c/c++有很深入的接触,否则都是偏面的.
    另外从网上的结果看大家都谈到了一个共同点,编译的方式或机制是对速度是有影响的.在这里提到了java的动态编译的问题JIT(just in time).很明显很多c/c++程序员他不了解java的运行机制,java的动态编译是这样描述的,首先写完一个helloworld.java的源文件交由java compiler得到helloworld .class文件,java.exe会启动Java Virtual Machine,并加载这个class文件通过JIT编译为本机的机器代码.特别要强调的是这个class文件,它是编译原理中所谓的中间代码,它并不是目标代码.也正因为有了这个中间代码才使动态编译得 ......

java快 还是 c快[c++快],似是而非的谈

    首先说明一下这个”快”的含义,我想以前那些讨论这个话题的人当然认为这个快是指程序的运行速度,至于”软件开发速度”恐怕想也没想,或许认为软件开发速度和这个话题扯不上一点关系.那么这个问题在网上搜搜,搜的一大堆,那些c/c++阵营的列了很多例子来说明c/c++快, java阵营的也是如此,还提供一些机构的数据来说明java并不慢.可是仍然没有让大家都信服的理由或者结果.从这些讨论中我们应该得到一些启示,那就是讨论这个话题的前提是讨论的人必须既对java有很深的了解还要对c/c++有很深入的接触,否则都是偏面的.
    另外从网上的结果看大家都谈到了一个共同点,编译的方式或机制是对速度是有影响的.在这里提到了java的动态编译的问题JIT(just in time).很明显很多c/c++程序员他不了解java的运行机制,java的动态编译是这样描述的,首先写完一个helloworld.java的源文件交由java compiler得到helloworld .class文件,java.exe会启动Java Virtual Machine,并加载这个class文件通过JIT编译为本机的机器代码.特别要强调的是这个class文件,它是编译原理中所谓的中间代码,它并不是目标代码.也正因为有了这个中间代码才使动态编译得 ......

关于C/C++的位域

在C/C++中我们有时为了节省内存占用空间,需要使用到位域,如下所示代码:
struct SDummy
{
  int A : 2;
  int B : 8;
  int C : 12;
  int D : 10;
};
    在计算机内存昂贵的情况下,位域不乏为一种有效的节省内存占用空间又让代码书写比较通俗易懂的方法。但是在现今内存相对便宜的时代,应用软件中似乎已经很少见到位域的使用了。位域的使用,在学习C语言的时候有学习过,但是在实际项目中很少用到,也没有仔细去研究它,直到上周我为了让一个64位的变量表示我所需要的几个信息时,才将它仔细去研究了一番。
    我在最近的项目中,需要一个变量,通过这个变量能知道其表示的年月日时分秒等信息。由于我想使年可表示20年即可,故需要5位来表示;月共12月,需要4位;日共31日,需要5位;时共24小时,需要5位;分60分,需要6位;秒60秒,需要6位;当然还有其它信息,我也根据需要分配了相应位的位域。于是我写出了如下所示代码:
struct SDummy
{
  U8  Year : 5;
  U8  Month : 4;
  U8  Day : 5;
  U8 Hour : 5;
  U8 Minute :6;
  U8 Second : 6;
& ......

关于C/C++的位域

在C/C++中我们有时为了节省内存占用空间,需要使用到位域,如下所示代码:
struct SDummy
{
  int A : 2;
  int B : 8;
  int C : 12;
  int D : 10;
};
    在计算机内存昂贵的情况下,位域不乏为一种有效的节省内存占用空间又让代码书写比较通俗易懂的方法。但是在现今内存相对便宜的时代,应用软件中似乎已经很少见到位域的使用了。位域的使用,在学习C语言的时候有学习过,但是在实际项目中很少用到,也没有仔细去研究它,直到上周我为了让一个64位的变量表示我所需要的几个信息时,才将它仔细去研究了一番。
    我在最近的项目中,需要一个变量,通过这个变量能知道其表示的年月日时分秒等信息。由于我想使年可表示20年即可,故需要5位来表示;月共12月,需要4位;日共31日,需要5位;时共24小时,需要5位;分60分,需要6位;秒60秒,需要6位;当然还有其它信息,我也根据需要分配了相应位的位域。于是我写出了如下所示代码:
struct SDummy
{
  U8  Year : 5;
  U8  Month : 4;
  U8  Day : 5;
  U8 Hour : 5;
  U8 Minute :6;
  U8 Second : 6;
& ......

C/C++ 函数参数的入栈顺序

对技术执着的人,比如说我,往往对一些问题,不仅想做到“知其然”,还想做到“知其所以然”。C语言可谓博大精深,即使我已经有多年的开发经验,可还是有许多问题不知其所以然。某天某地某人问我,C语言中函数参数的入栈顺序如何?从右至左,我随口回答。为什么是从右至左呢?我终究没有给出合理的解释。于是,只好做了个作业,于是有了这篇小博文。
#include <stdio.h>
void foo(int x, int y, int z)
{
        printf("x = %d at [%X]\n", x, &x);
        printf("y = %d at [%X]\n", y, &y);
        printf("z = %d at [%X]\n", z, &z);
}
int main(int argc, char *argv[])
{
        foo(100, 200, 300);
        return 0;
}
运行结果:
x = 100 at [BFE28760]
y = 200 at [BFE28764]
z = 300 at [BFE28768]
C程序栈底为高地址,栈顶为低地址,因此上面的实例可以说明函数参数入栈顺序的确是从右至左的。可到底为什 ......

C/C++ 函数参数的入栈顺序

对技术执着的人,比如说我,往往对一些问题,不仅想做到“知其然”,还想做到“知其所以然”。C语言可谓博大精深,即使我已经有多年的开发经验,可还是有许多问题不知其所以然。某天某地某人问我,C语言中函数参数的入栈顺序如何?从右至左,我随口回答。为什么是从右至左呢?我终究没有给出合理的解释。于是,只好做了个作业,于是有了这篇小博文。
#include <stdio.h>
void foo(int x, int y, int z)
{
        printf("x = %d at [%X]\n", x, &x);
        printf("y = %d at [%X]\n", y, &y);
        printf("z = %d at [%X]\n", z, &z);
}
int main(int argc, char *argv[])
{
        foo(100, 200, 300);
        return 0;
}
运行结果:
x = 100 at [BFE28760]
y = 200 at [BFE28764]
z = 300 at [BFE28768]
C程序栈底为高地址,栈顶为低地址,因此上面的实例可以说明函数参数入栈顺序的确是从右至左的。可到底为什 ......

C和C++的位运算

  有次一个同事问我
    swc ^= swc;
  是什么意思,我也不知道,查了下,意思应该是将swc变量清0,疑惑的是为什么就不能写成 swc = 0; 呢?不明白
  顺便记录下其他的操作,碰到新的再追加:
    swc = ~swc;    //变量取反 ......

C和C++的位运算

  有次一个同事问我
    swc ^= swc;
  是什么意思,我也不知道,查了下,意思应该是将swc变量清0,疑惑的是为什么就不能写成 swc = 0; 呢?不明白
  顺便记录下其他的操作,碰到新的再追加:
    swc = ~swc;    //变量取反 ......

浅谈C与C++的设计与编程风格(二)

上次总结了C++(面向对象)设计的核心思想,并且例举了使用类模型来替代if和switch的一种较为典型的情况。下面想来谈谈C++在编码方面的特点。
在很多经典的C++教程中都有一个建议:应尽量使用户代码(库的使用者)看起来短小而简单。按照常识,简单的代码通常要比大段的代码好理解,而用户代码通常实现的是最上层的功能或者界面,它的不确定性更大,经验告诉我们,最容易出错的代码正是那些被频繁修改的代码!因此简单的用户代码是有好处的,在开发一个库时我们应尽量遵守这个建议。
C++有两个机制可以帮助我们实现这一点,一个是运算符重载,另一个就是模板。
C++的运算符重载机制非常强大,这里就举一个简单的例子。C语言中有一种对数组的特殊初始化方式,比如:int a[4] = {1,4,2,3}; 这样的语法非常清晰且容易让人理解,然而很可惜的是,这样的语法不能用于对数组的赋值,对数组的赋值必须使用一个循环操作,当这个数组中的内容不是按顺序排列时,对数组的赋值很可能会演变成一个非常复杂的过程。
但是在C++中,我们却可以利用重载运算符来实现一种相似的赋值语法,方法就是我们设计一个迭代器,并重载该迭代器的 , 运算符,然后再设计一个可以使用这个迭代器的数组类 ......

浅谈C与C++的设计与编程风格(二)

上次总结了C++(面向对象)设计的核心思想,并且例举了使用类模型来替代if和switch的一种较为典型的情况。下面想来谈谈C++在编码方面的特点。
在很多经典的C++教程中都有一个建议:应尽量使用户代码(库的使用者)看起来短小而简单。按照常识,简单的代码通常要比大段的代码好理解,而用户代码通常实现的是最上层的功能或者界面,它的不确定性更大,经验告诉我们,最容易出错的代码正是那些被频繁修改的代码!因此简单的用户代码是有好处的,在开发一个库时我们应尽量遵守这个建议。
C++有两个机制可以帮助我们实现这一点,一个是运算符重载,另一个就是模板。
C++的运算符重载机制非常强大,这里就举一个简单的例子。C语言中有一种对数组的特殊初始化方式,比如:int a[4] = {1,4,2,3}; 这样的语法非常清晰且容易让人理解,然而很可惜的是,这样的语法不能用于对数组的赋值,对数组的赋值必须使用一个循环操作,当这个数组中的内容不是按顺序排列时,对数组的赋值很可能会演变成一个非常复杂的过程。
但是在C++中,我们却可以利用重载运算符来实现一种相似的赋值语法,方法就是我们设计一个迭代器,并重载该迭代器的 , 运算符,然后再设计一个可以使用这个迭代器的数组类 ......

通过JNI 实现 java与C++之间的信息传递

定义一个native 方法:
package ext;
import java.util.Hashtable;
public class TestJNI
{
   static
   {
       System.loadLibrary("dllfile");
   }
    public TestJNI()
    {
        Hashtable htable = new Hashtable();
        htable.put(1,2);
    }
    public native Hashtable getNameList();
    public static void main(String[] arg)
    {
        TestJNI tstJNI= new TestJNI();
        Hashtable htable= tstJNI.getNameList();
        System.out.println(htable.size());
    }
}
通过 javah 生成 头文件 ext_TestJNI.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class ext_TestJNI ......

通过JNI 实现 java与C++之间的信息传递

定义一个native 方法:
package ext;
import java.util.Hashtable;
public class TestJNI
{
   static
   {
       System.loadLibrary("dllfile");
   }
    public TestJNI()
    {
        Hashtable htable = new Hashtable();
        htable.put(1,2);
    }
    public native Hashtable getNameList();
    public static void main(String[] arg)
    {
        TestJNI tstJNI= new TestJNI();
        Hashtable htable= tstJNI.getNameList();
        System.out.println(htable.size());
    }
}
通过 javah 生成 头文件 ext_TestJNI.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class ext_TestJNI ......
总记录数:969; 总页数:162; 每页6 条; 首页 上一页 [65] [66] [67] [68] 69 [70] [71] [72] [73] [74]  下一页 尾页
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号