C语言的执行效率问题,以及哪些因素与C语言中的程序执行效率有关

发布于 科技 2024-06-09
4个回答
  1. 匿名用户2024-01-29

    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)

  2. 匿名用户2024-01-28

    它应该是 int i 作为全局变量。 存储在数据段中(堆? )

    int i a 的局部变量。 堆叠存放。

    答案是肯定的。 计算执行中的差异。 当然,这个测试没有区别。

  3. 匿名用户2024-01-27

    说实话,这个问题比较大,C语言被誉为最灵活的语言,九曲十八弯,千变万化,如何使程序高效运算,取决于程序员对底层计算机的理解和对C语言的熟练程度。 不过,从单独回答问题的角度来看,我在此提出几点仅供参考:

    1.使用指针:对指针的简单理解可以认为类似于汇编中的寻址方法,正是指针的存在使得 C 如此强大。

    有些程序可以用其他语言实现,但 C 可以更有效地实现; 有些程序不能用其他语言实现,例如直接访问硬件,但 C 可以。 由于指针可以具有类似程序集的地址,因此它们可以使程序更有效率。

    2.使用宏函数:函数和宏函数的区别在于宏函数占用大量空间,而函数占用时间。

    如果编译器中有堆栈检查选项,则会在函数的头部嵌入一些汇编语句来检查当前堆栈; 同时,调用函数时,CPU还需要保存和恢复当前场景,并执行堆栈按下和弹跳堆栈操作,因此函数调用需要一些CPU时间。 宏函数没有这个问题。 宏函数只是作为预先编写的**嵌入到当前程序中,不会生成函数调用,所以只占用空间,使程序高效运行。

    当频繁调用相同的宏函数时尤其如此。

    3.使用位运算:位运算可以减少除法和模运算。

    在计算机程序中,数据位是可以操作且理论上可以使用的最小数据单位"按位运算"完成所有计算和操作。 典型的比特操作用于控制硬件或转换数据,但灵活的比特操作可以有效提高程序操作的效率。

    4.在循环嵌套中,较长的循环设置为内存循环,较短的循环设置为外部循环,以减少CPU跨循环层数,提高程序的运行效率。

  4. 匿名用户2024-01-26

    时间复杂性和空间复杂性。

    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的增加,上述时间复杂度增加,算法的执行效率降低。

相关回答
12个回答2024-06-09

int q2, *q1;回顾过去,Q2 是 int,Q1 是 int*。

10个回答2024-06-09

int i=0;

char s1[10]="abc",s2[10]="efg"; >>>More

18个回答2024-06-09

第一个:scanf("%d",a);

它应该是 scanf("%d",&a); >>>More

21个回答2024-06-09

取决于它是在 scanf 还是 printf 中使用。

在 scanf 中,添加 * 的部分将被忽略,并且不会被参数检索。 >>>More

27个回答2024-06-09

不一定。 以下是一些示例:

#include >>>More