能力值:
( LV13,RANK:410 )
|
-
-
2 楼
实际上,最终编译出来,还是在程序主体前面一次性声明,当然,可能会被优化成临时使用寄存器。
作用域的话是以{}为界,在花括号内的变量,在花括号外引用若无同名变量则无效,若有同名变量,则引用括号外的这个变量。
你可以将括号内的程序视为一个内联的过程,里面定义的变量出了括号就被销毁了,下次再执行到这里的时候,相当于再次调用内联过程,里面的变量再次被定义。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
编译好了,你看一下汇编代码就知道了
一些临时变量可能直接用寄存器或者在栈分配,用完了就删除
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
要那样的话,每个循环体都可以视为一个内联过程,每一个条件处理体都可以视为一个内联过程,相当于没有函数名和零参数的函数。是这样吧!?
|
能力值:
( LV12,RANK:340 )
|
-
-
5 楼
临时变量的作用域仅限于{}之内。
临时变量是在栈上开辟的空间,
而在cpp文件头或函数外定义的变量,会被分配到程序的.data段。
属于单元模块的全局变量。
这些只是在没有优化下可能的情况。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
那优化后,是什么情况啊!?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
因为编译器的存在, 所有的变量尽可能在需要的时候定义
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
这种做法貌似是针对那种没有事先设计的拍脑袋编程吧,编到哪算哪的情况。如果有事先设计,不可能不事先知道需要什么变量、需要什么数据结构的。这样一来,在程序文件开头定义也就没什么难的。定义不代表立刻就用啊!
|
能力值:
( LV4,RANK:50 )
|
-
-
9 楼
建议你系统地学一下c编程,顺便了解一下在不同位置声明的变量会被放到什么地方。你全局声明的变量最终会出现在data或bss段,函数体内声明的变量要么会在栈上分配(当然还涉及到栈“槽”复用),或者直接被优化,分配到寄存器中。要尽可能做到全局变量越少越好
|
能力值:
( LV3,RANK:30 )
|
-
-
10 楼
尽量少定义全局变量,局部用完没用的变量尽量在局部定义,写惯了C的变量定义方式。到C++就有点不适应了,适应就好了
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
我觉得我用的不是全局变量。我只是在函数开始的位置声明,而不是在代码中随机声明。我在win32程序中用局部static变量代替某些全局变量的作用。这应该不算坏习惯吧!
我大学C语言课程自己考的90多分,应该还行吧!在那些抄袭的面前自问还是比较有底气吧!
虽然这么多年了,自问没荒废啥基本功。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
好象在哪本书上看到过,可能是effctive c++, 鼓励把变量定义推迟到使用的地方
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
那如果在循环体中定义,又如何呢?每循环一次,都定义一次?
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
变量定义是给编译器看的, 又不是每执行一轮循环会产生额外的开销,有何不可?
|
能力值:
( LV5,RANK:60 )
|
-
-
15 楼
ASM中数据放在代码段中定义,还可以有混淆调试代码的作用。
|
能力值:
( LV4,RANK:50 )
|
-
-
16 楼
如果你了解编译器的话,会明白这些函数体内的变量的定义都会由编译器帮你优化,要么在栈上分配一个“槽”,要么分配到寄存器。你在函数开头定义和循环体内定义对程序员来说只是作用域不同。
|
能力值:
( LV12,RANK:340 )
|
-
-
17 楼
就像前面那个说的,有时候临时变量会被优化到寄存器。
比如
DWORD Pid = GetProcessId();
func(Pid);
如果func的引用次数少,或开启了运行速度优化,func就有可能被优化成内联函数,那么Pid也就被优化成寄存器了。
或者被优化成fastcall的函数,参数就不经栈传递,就变成寄存器传送了。
以上纯属本人个人观点。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
ganboing
建议你系统地学一下c编程,顺便了解一下在不同位置声明的变量会被放到什么地方。你全局声明的变量最终会出现在data或bss段,函数体内声明的变量要么会在栈上分配(当然还涉及到栈“槽”复用),或者直接被优 ...
哪本C语言的书能讲得这么深?我重前看的是谭浩强的那本,貌似没讲这些。
|
|
|