C真的是“伪装大会”吗?

时间:2010-05-28 17:29:40

标签: c++ c

作为一名C ++程序员,我现在决定学习C以“更好地控制”我写的内容。

  • C中是否有任何语法特征导致相当不可预测的汇编程序代码?与C ++中的虚函数一样

  • C是伪装的汇编程序吗?我非常喜欢这个想法。

3 个答案:

答案 0 :(得分:3)

由编译器决定汇编代码是什么。根据您的优化,这可能是安静不可预测的。如果您正在使用gcc(我确信其他编译器也有此选项),您可以使用-O0标志尽可能简单地编译代码。

答案 1 :(得分:1)

可以以这样一种方式编写C,使得它与将要生成的程序集几乎一一对应。引入更高级别的构造时,每个语句将生成更多的程序集。各种C构造应该每次都生成相同的装配模式,因此如果您对这些装配惯用法感到满意,就可以开始将这些更高级别的构造合并到C代码中。

优化编译器(可能非常积极)可以改变代码执行的顺序,并进行其他权衡,可以改变程序集的外观,以便使得到的目标代码更小或更快。据我所知,如果您愿意,可以禁用这些优化。

(请注意,我并不真正推荐这些方法中的任何一种,也不会使用它们。但是,如果您决定要查看它们,可以使用它们。)

答案 2 :(得分:1)

我不相信C语言比C ++更“控制”是准确的。 C ++的近乎超集的功能意味着你可以用C语言做任何你可以用C语言做的事情。在C ++中有些事情比较繁琐(比如需要将void *转换为另一种类型),但是有很多我觉得C ++中的东西很方便(比如不需要输入你的结构来避免在你想要foo的地方写struct Foo)。

我觉得 是一个很好的练习,试图尽可能地从你的编程中删除尽可能多的“高级”C ++特性,并且只使用那些“复杂的位”(在当你绝对需要它们时,编译代码的条款,而不是理解代码。抛弃成员函数,RTTI和异常将为您提供一个好方法。

至于您的具体问题:除非您知道该功能正在做什么,否则一切都会导致无法预测的机器代码。我认为,虚拟函数生成的代码是该功能更直接,更明显的实现之一。 C不会像C ++那样为“伪装的汇编程序”提供额外的访问权限;您可以对两者进行位操作,并且(您可以尝试)在您选择的任何地方直接写入内存。在任何一种语言中,您也可以直接编写机器代码,只需将一个字节数组转换为函数并调用它即可。这不会被认为是广泛的可移植性,但如果它是你所追求的力量,C ++就不会隐藏任何东西。