-
a、变量 i 在 main 函数的堆栈上。
b,变量 i 位于数据段上。
这个问题的答案与系统的内存管理有关。
在 Win32 平台上,程序的内存是平坦布局的,但无论是在堆栈上还是在数据段上,访问 I 的开销都是相同的。
DoS 使用分段内存管理,访问堆栈上的数据的成本可能与访问全局分段中的数据不同。 这也与程序的复杂性有关。
在 x86 平台上。
存储器中的数据都不能直接操作,必须将其读入寄存器,进行操作,然后写回存储器。
在上面的两段中。
i 不可能使内存永久化,因为每一轮循环 i 都会发生变化。
上面**中i的运算如下。
将 i 读入寄存器。
将寄存器中的数字加 1
将寄存器中的数据写回内存。
将内存中的数据与 10,000 进行比较。
下面是 Windows XP+VC2002 下的两段 ** 反编译,可以看出是完全一样的。
a004015af mov dword ptr [i],0
004015b6 jmp main+1fh (4015c1h)
004015b8 mov eax,dword ptr [i]
004015bb add eax,1
004015be mov dword ptr [i],eax
004015c1 cmp dword ptr [i],2710h
004015c8 jge main+2fh (4015d1h)
004015ca call foo (401087h)
004015cf jmp main+16h (4015b8h)
b004015a6 mov dword ptr [i],0
004015ad jmp main+16h (4015b8h)
004015af mov eax,dword ptr [i]
004015b2 add eax,1
004015b5 mov dword ptr [i],eax
004015b8 cmp dword ptr [i],2710h
004015bf jge main+26h (4015c8h)
004015c1 call foo (401087h)
004015c6 jmp main+0dh (4015afh)
-
它应该是 int i 作为全局变量。 存储在数据段中(堆? )
int i a 的局部变量。 堆叠存放。
答案是肯定的。 计算执行中的差异。 当然,这个测试没有区别。
-
说实话,这个问题比较大,C语言被誉为最灵活的语言,九曲十八弯,千变万化,如何使程序高效运算,取决于程序员对底层计算机的理解和对C语言的熟练程度。 不过,从单独回答问题的角度来看,我在此提出几点仅供参考:
1.使用指针:对指针的简单理解可以认为类似于汇编中的寻址方法,正是指针的存在使得 C 如此强大。
有些程序可以用其他语言实现,但 C 可以更有效地实现; 有些程序不能用其他语言实现,例如直接访问硬件,但 C 可以。 由于指针可以具有类似程序集的地址,因此它们可以使程序更有效率。
2.使用宏函数:函数和宏函数的区别在于宏函数占用大量空间,而函数占用时间。
如果编译器中有堆栈检查选项,则会在函数的头部嵌入一些汇编语句来检查当前堆栈; 同时,调用函数时,CPU还需要保存和恢复当前场景,并执行堆栈按下和弹跳堆栈操作,因此函数调用需要一些CPU时间。 宏函数没有这个问题。 宏函数只是作为预先编写的**嵌入到当前程序中,不会生成函数调用,所以只占用空间,使程序高效运行。
当频繁调用相同的宏函数时尤其如此。
3.使用位运算:位运算可以减少除法和模运算。
在计算机程序中,数据位是可以操作且理论上可以使用的最小数据单位"按位运算"完成所有计算和操作。 典型的比特操作用于控制硬件或转换数据,但灵活的比特操作可以有效提高程序操作的效率。
4.在循环嵌套中,较长的循环设置为内存循环,较短的循环设置为外部循环,以减少CPU跨循环层数,提高程序的运行效率。
-
时间复杂性和空间复杂性。
1.空间复杂度是指在计算机中执行算法所需的存储空间的测量。
2.一般来说,算法中基本运算的重复次数是问题尺度n的函数,用t(n)表示,如果存在辅助函数f(n),则当n趋近无穷大时,t(n)f(n)的极限值是一个不等于零的常数, 那么 f(n) 被称为与 t(n) 相同数量级的函数。表示为 t(n)= (f(n)),称为 (f(n)) 是算法的渐进时间复杂度,称为时间复杂度。
在不同的算法中,如果算法中执行的语句个数为常数,则时间复杂度为o(1),当时间频率不相同时,时间复杂度可能相同,例如t(n)=n2+3n+4和t(n)=4n2+2n+1的频率不同,但时间复杂度相同, 两者都是 O(N2)。
按数量级排列,常见的时间复杂度为:
常数阶o(1),对数阶o(log2n),线性阶o(n),线性对数阶o(nlog2n),平方阶o(n 2),三次阶o(n 3),.,k 到 k 的幂 o (n k) 和指数 o (2 n)。 随着问题大小n的增加,上述时间复杂度增加,算法的执行效率降低。
取决于它是在 scanf 还是 printf 中使用。
在 scanf 中,添加 * 的部分将被忽略,并且不会被参数检索。 >>>More