1 const int 变量在程序运行时占据4字节的地址空间,但与普通变量不同的是它不在栈上分配
而是在静态数据区分配。其实这个消耗相对于现在的计算机配置和程序大小来说并不大。2  没有用到的话,一般的成员变量不会被编译到最终的程序中
一旦使用就会整个类都要编译到程序里3 不会4 fastcall要快一些,它把前两个变量放在寄存器中,速度上会有所提高

解决方案 »

  1.   

    谢谢yoci的指点,不过我还有点问题:
    1.单独的几个const int消耗是不大,不过如果你想想看Windows里面有多少个#define(不是自己定义的,而是在winuser.h,winbase.h这样的文件中定义的),你就不会说这个开销不大了.
    其实这个问题意义并不大,但是我想#define的作用应该不是像有些人所说的完全可以用const来代替,只要不滥用,宏代换还是很好用的.
    3.我昨天想到的结果应该是不完全相同,比如C和C++生成函数名称的方法就不相同,否则C++就无法实现函数重载.不过这不算个问题,我回去些个程序测试一下就行了.还是谢谢你.
    4.这个问题我也去写个程序测试一下好了.从我看到的资料来看,好像cdecl应该是最慢的(个人猜测).
      

  2.   

    #define 只不过是在编译阶段的字符串替换而已,程序运行时还是要分配空间的,但是不用的变量
    是不会被编译的,
    比如 #define a 100
    在所有用a的地方用常量100替换,这个常量还是需要内存空间的,只不过是在静态存储区中
    但是#define不仅仅是当常量用的,她有很多功能是const 或 inline 所无法替代的比如# ##
      

  3.   

    另外,c cpp编译的方式只会对编译和连接的时间有影响,对运行时的性能是没有影响的,这个问题
    其实没有什么太大的意义,如果你用vc,相信编译器的优化就是了
      

  4.   

    我想不是这样吧!比如#define WM_CREATE 0001,如果用常量的话,那么肯定要定义为一个全局常量,而全局常量是任何时候都要占用内存的.而#define的话只有在用到的函数中扩展,函数返回以后就不用占用内存了.此外我想像这样两种写法:
    if (msg==0x0001)

    const int WM_CREATE=0x0001;
    if (msg==WM_CREATE)
    他们生成的汇编代码应该是不相同的吧?我对汇编稍微有一点概念,汇编里面对像mov ax,0x01和mov ax,[bx]这样的效率是不同的.
    对C/CPP的问题,我也知道对运行时的性能影响是微乎其微的,我并不是在乎那一点点性能,而是从技术的角度关心其中的细节而已.
      

  5.   

    结果:.c和.cpp编译生成的文件大小是完全一样的.
    不过我发现,像下面这两个程序生成的文件大小也是完全一样,这我就想不通了,我觉得第二个怎么也应该比第一个大十几个字节才对.有人能解释一下吗?我用的都是Release模式,而且Code Generation对齐到1字节.
    1.void main()
    {
      printf("Hello,World!\n");
    }
    2.void func1()
      {printf("This is just a test.\n"); }
      void main()
    {
      func1();
      printf("Hello,World!\n");
    }
      

  6.   

    生成的.exe是不是都是4k的整倍数?这因为Release版生成的exe是分段的,如果代码不足一段也会编译成一段。所以差别小于4k的程序总是一样大小的。
      

  7.   

    没错,文件大小是7*4k,看来就是这个原因了,多谢In355Hz
    我花了不少时间去测stdcall,cdecl,fastcall的效率,可测来测去总是一样,是我的算法不行,还是ms级的精度不够?不过还是感谢各位.
      

  8.   

    不占内存,这里和#define的效果是一样的。你只要看看他汇编出来的代码就知道了,const变量是直接用具体数值代替的。
      

  9.   

    singlerace和yoci说的好像矛盾阿...谁说的对?我还是回去看一下好了
      

  10.   

    只能回答1。
    你知道RAM和ROM的区别吗?const int val=0,那么var就是ROM中的数据。如果没有const 那么其就存在RAM中。
      

  11.   

    c cpp 在编译方式上的差别很大,同时CPP在编译时提供了很多的选择,即使同一个CPP在不同的编译方式下也是不同的,其性能也自然不同,这不是一个简单的HELLO WORLD就能体现的,CPP支持异常,虽然你的函数没有用,但你不能担保你使用的C++库没用。所以你必须为此付出代价,包括代码的大小和性能。
      

  12.   

    cdecl 和stdcall我认为没有性能的差别,他们只是在参数的压栈顺序和栈的释放职责上有些差别。
      

  13.   

    ????????我还是第一次听说程序的数据可以存在于ROM中,不知道有没有出处?在我印象中ROM里面都是BIOS固化的部分和显示器的缓存.
    to tridust:我同意你的看法,我的问题本意是比较C和CPP在同等条件下的大小和效率,如果让CPP程序使用了异常这些功能,而C程序没有办法使用,那么这种比较就不是公平的.
    又:我始终认为cdecl和stdcall应该是有性能差别的,毕竟世界上没有完全相同的两片树叶么.除非你能证明两种调用方法产生的机器指令是完全相同的,那我就死心塌地的相信你.
      

  14.   

    我不知道为什么大家都说cdecl和stdcall的进栈顺序不同。以我的观察,至少在VC++中,他们是一样的,都是right to left。不信你去翻msdn,或者自己看编译出来的代码。
      

  15.   

    的确!可是以前都说C和Pascal的进栈顺序是相反的,而pascal现在被stdcall代替了,可能大家都没太注意吧!我看到msdn里面有个__pascal的条目,不过已经absolute了!
    另外,In355HZ说exe总是对齐到4K的,从VC生成的代码来看也确实是这样,可是我昨天用Borlan C++5.02编译的程序只有7.5K!看来对齐也不是绝对的.
      

  16.   

    我认为没有目的的过分追求某种细节是对时间的浪费,就拿cdecl stdcal来说,具体的实现是complier-dependent 的,也许对某种调用方法某种编译器有自己的优化,但这都不是语言本身所决定的。
    对一个项目来说(不是简单的HELLO WORLD),肯定c的效率要高于c++,当初Linux也曾考虑
    用c++开发Linux,也是考虑到效率问题才采用C。(我认为可能更要命的可能是c++的编译
    时间,Linux动不动就重新编译内核,c++肯定让人受不了)。