首页
社区
课程
招聘
[求助]编程代码问题!!!请编程高手指教。
2013-10-12 10:46 10888

[求助]编程代码问题!!!请编程高手指教。

2013-10-12 10:46
10888
最近看到一些win32的代码(很多是从书上看到的),变量声明写在程序体里,并不是在程序前面位置。这与我的编程风格不符。如果只是编程风格倒不算问题。

但这是不是涉及在作用域的大小呢?
另外,在一个循环体里声明变量,会怎样呢?每执行一次循环就声明一个同名变量,是不是涉及变量在runtime时的重复声明啊!?

因为我平时不这么用,所以看到别人这么用,特问一下。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
打赏
分享
最新回复 (17)
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
无聊的菜鸟 9 2013-10-12 10:52
2
0
实际上,最终编译出来,还是在程序主体前面一次性声明,当然,可能会被优化成临时使用寄存器。
作用域的话是以{}为界,在花括号内的变量,在花括号外引用若无同名变量则无效,若有同名变量,则引用括号外的这个变量。
你可以将括号内的程序视为一个内联的过程,里面定义的变量出了括号就被销毁了,下次再执行到这里的时候,相当于再次调用内联过程,里面的变量再次被定义。
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wenjn 2013-10-12 10:58
3
0
编译好了,你看一下汇编代码就知道了
一些临时变量可能直接用寄存器或者在栈分配,用完了就删除
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
永垂不朽 2013-10-12 11:17
4
0
要那样的话,每个循环体都可以视为一个内联过程,每一个条件处理体都可以视为一个内联过程,相当于没有函数名和零参数的函数。是这样吧!?
雪    币: 7076
活跃值: (3478)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
bxc 6 2013-10-12 16:09
5
0
临时变量的作用域仅限于{}之内。
临时变量是在栈上开辟的空间,
而在cpp文件头或函数外定义的变量,会被分配到程序的.data段。
属于单元模块的全局变量。
这些只是在没有优化下可能的情况。
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
永垂不朽 2013-10-12 16:53
6
0
那优化后,是什么情况啊!?
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
修莫问 2013-10-12 17:15
7
0
因为编译器的存在, 所有的变量尽可能在需要的时候定义
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
永垂不朽 2013-10-12 17:34
8
0
这种做法貌似是针对那种没有事先设计的拍脑袋编程吧,编到哪算哪的情况。如果有事先设计,不可能不事先知道需要什么变量、需要什么数据结构的。这样一来,在程序文件开头定义也就没什么难的。定义不代表立刻就用啊!
雪    币: 200
活跃值: (38)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ganboing 1 2013-10-12 17:42
9
0
建议你系统地学一下c编程,顺便了解一下在不同位置声明的变量会被放到什么地方。你全局声明的变量最终会出现在data或bss段,函数体内声明的变量要么会在栈上分配(当然还涉及到栈“槽”复用),或者直接被优化,分配到寄存器中。要尽可能做到全局变量越少越好
雪    币: 36
活跃值: (45)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
wjuid 2013-10-12 17:48
10
0
尽量少定义全局变量,局部用完没用的变量尽量在局部定义,写惯了C的变量定义方式。到C++就有点不适应了,适应就好了
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
永垂不朽 2013-10-12 18:23
11
0
我觉得我用的不是全局变量。我只是在函数开始的位置声明,而不是在代码中随机声明。我在win32程序中用局部static变量代替某些全局变量的作用。这应该不算坏习惯吧!

我大学C语言课程自己考的90多分,应该还行吧!在那些抄袭的面前自问还是比较有底气吧!

虽然这么多年了,自问没荒废啥基本功。
雪    币: 1
活跃值: (1174)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SdKfz 2013-10-12 18:38
12
0
好象在哪本书上看到过,可能是effctive c++, 鼓励把变量定义推迟到使用的地方
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
永垂不朽 2013-10-12 18:40
13
0
那如果在循环体中定义,又如何呢?每循环一次,都定义一次?
雪    币: 1
活跃值: (1174)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SdKfz 2013-10-12 20:52
14
0
变量定义是给编译器看的, 又不是每执行一轮循环会产生额外的开销,有何不可?
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
笨奔 1 2013-10-12 22:21
15
0
ASM中数据放在代码段中定义,还可以有混淆调试代码的作用。
雪    币: 200
活跃值: (38)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ganboing 1 2013-10-12 22:59
16
0
如果你了解编译器的话,会明白这些函数体内的变量的定义都会由编译器帮你优化,要么在栈上分配一个“槽”,要么分配到寄存器。你在函数开头定义和循环体内定义对程序员来说只是作用域不同。
雪    币: 7076
活跃值: (3478)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
bxc 6 2013-10-13 00:51
17
0
就像前面那个说的,有时候临时变量会被优化到寄存器。
比如
DWORD Pid = GetProcessId();
func(Pid);
如果func的引用次数少,或开启了运行速度优化,func就有可能被优化成内联函数,那么Pid也就被优化成寄存器了。
或者被优化成fastcall的函数,参数就不经栈传递,就变成寄存器传送了。

以上纯属本人个人观点。
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
永垂不朽 2018-1-7 17:39
18
0
ganboing 建议你系统地学一下c编程,顺便了解一下在不同位置声明的变量会被放到什么地方。你全局声明的变量最终会出现在data或bss段,函数体内声明的变量要么会在栈上分配(当然还涉及到栈“槽”复用),或者直接被优 ...
哪本C语言的书能讲得这么深?我重前看的是谭浩强的那本,貌似没讲这些。
游客
登录 | 注册 方可回帖
返回