C代码中的惊喜

C语言非常灵活和表现力;这些是原因,为什么它成功和有弹性被“更好”的语言所取代。其灵活性的一个例子是以多种功能等同的方式编写表达式的可能性。这使得编码风格适应个人需求。但是,有一个捕获量:有时,显然等效的代码具有细微差异。这可能发生在最简单的代码中,我们将探讨本文中的一些可能性。

对于C提供多种不同的方式来做一些不同的方式是常见的,这一切都是相同的。例如,鉴于这一点 x是正常的变量,以下每个陈述都将做出完全相同的作业:

x = x + 1;
x += 1;
x++;
++x;

在每种情况下1将被添加到x。唯一可能的区别在于,较少的编译器可能会为最后两个选项产生稍微更好的代码(这将是一个更好的编译器值得的提示)。

这两种形式++操作员,以这种方式使用,产生相同的结果。但是,如果使用表达式的值,则预增量和递增后递增是不同的,因此:

y = x++;   // y has the value of x before the increment
y = ++x;   // y has the value of x after the increment

有趣的是,增量稍微“昂贵”稍微“昂贵”,因为需要分配存储以保持旧值x。但是,编译器可能会很优化它。如果在未使用表达式值时分配存储,则肯定需要新的编译器!

如果,而不是作为一个, x是一个指针,加入1会产生添加的效果4(在32位机器上)。如果这是一个大惊喜,一个刷在指针算术上一切顺利。

但是,有时似乎等同于等同的构造具有非常细微的差异…

可能在任何编程语言中可以执行的最简单的事情是将值为变量的值分配。所以,在c中,我们可能会写:

alpha = 99;
beta = 99;
gamma = 99;

当然,这可能是如此紧凑地写入:

alpha = beta = gamma = 99;

这些是100%等价物。还是他们?

大多数时候,这两个构造完全等同,但是(至少)选择一个或另一个时的四种情况可能会有所不同:

首先,最初的,每个变量都是分开的,也许是一个评论,指示它将其设置为此值的原因可能是合适的。

其次,写可维护代码总是好的。也许在将来的某些时候,可能需要更改代码,以便所有三个变量都不设置为相同的值。第一个格式更容易改变它们。

第三种原因涉及不合标准的编译器,这可能会为第一个构造生成这样的代码:

mov r0, #99
mov alpha, r0
mov r0, #99
mov beta, r0
mov r0, #99
mov gamma, r0

第二种构建给出了暗示r0只需要加载一次。同样,更好的编译器不需要提示。

最后,有执行订单问题。在第一个构造中,完全清楚,alpha将首先分配和伽玛。因此,编译器将解释第二种结构:

alpha = (beta = (gamma = 99));

这意味着分配顺序颠倒。但这有什么事吗?大多数时候,它没有。但如果这些是设备寄存器,而不是普通变量,它可能会产生很大的差异。硬件非常常见,以便以精确的序列加载设置的设置值。

所以,我会说应该避免一个语句构造中的多个分配。

总的来说,虽然C是一种小语言,但可以争辩说,通过减少做事方式,它可能更小。结果可能是更清晰,更可维护的代码。


科林墙壁拥有四十多年的电子行业经验,主要致力于嵌入式软件。 Colin提供了频繁演示者和众多技术文章和嵌入式软件的两本书,是一个嵌入式软件技术专家,具有导师,西门子业务,是在英国。他的常规博客位于://blogs.sw.siemens.com/embedded-software/。他可能会通过电子邮件达成[email protected].

相关内容:

更嵌入,订阅嵌入式’S每周电子邮件时事通讯.

5思想“C代码中的惊喜

  1. 该死的好文章。鉴于嵌入式C程序员正在接近骨骼,这些东西对您来说可能更为明显。他们应该以读者和你知道’做了很好的工作。良好的工作,继续卡车运输......

    登录回复
  2. 另一个主要的惊喜来源是中断。

    例如,在链分配的情况下:
    alpha = beta = gamma = 99;
    在分配99之后,中断将重新分配Beta至77.然后结果将是:
    伽玛= 99;
    beta =伽玛;
    beta = 77;
    alpha = 77

    但是,在单独的作业的情况下:
    alpha = 99;
    β= 99;
    伽玛= 99;
    只有Beta被中断重新分配到77。

    人们期望在这种复合陈述中有一些原子,但是在C中没有定义。如果他希望如此,程序员可以在执行中禁用中断。

    登录回复
  3. 我会说这些惊喜只是“oversmart” code.
    现实世界中有多少次需要写作“alpha = beta = gamma = 99;”?
    换句话说,这种代码的好处是多少’S优化的输出与涉及的风险相比?

    此外,这种作业难以评论,因此可读性很差。
    当程序员写这样的代码时,我会质疑建筑师和设计师的能力。

    在古老的糟糕日子里,当记忆中的糟糕和kHz时钟时,有时会牺牲效率的可读性。
    在现代世界中,在可用的优秀优化编译器的情况下,内存丰富,处理器速度在100多岁的MHz应该,我们必须拨打这样的代码就像不安全或错误一样。

    登录回复

发表评论

本网站使用AkisMet减少垃圾邮件。了解如何处理评论数据.