【发布时间】:2011-09-17 22:42:03
【问题描述】:
是否可以在 C 中以可移植的方式进行自修改代码?
我问的原因是,在某种程度上,OOP 依赖于自修改代码(因为在运行时执行的代码实际上是作为数据生成的,例如在 v-table 中),然而,看起来如果这样做太过分了,它会阻止编译器中的大多数优化。
例如:
void add(char *restrict p, char *restrict pAddend, int len)
{
for (int i = 0; i < len; i++)
p[i] += *pAddend;
}
优化编译器可以将*pAddend 提升出循环,因为它不会干扰p。但是,这不再是自修改代码中的有效优化。
这样看来,C 语言似乎不允许自我修改代码,但同时,这是否意味着您不能在 C 语言中做一些诸如 OOP 之类的事情? C 真的支持自修改代码吗?
【问题讨论】:
-
C 具有函数指针,这是构建运行时调度机制所需的全部内容。您不需要“自修改代码”。
-
我不会说(比如)C++ 中的 OOP 实现使用自修改代码,在我看来,它只是数据驱动的代码。虚函数在概念上与简单的
switch没有什么不同。 -
@Nemo:那不还是一种自修改代码吗?
-
@Mehrdad:“自修改代码”通常是指更改实际的机器指令,但这实际上是一个定义问题。例如,您给出的优化示例 is 在存在函数指针的情况下有效。那么“自修改代码”到底是什么意思?
-
@Mehrdad:你在说自相矛盾的事情。 “我的示例中断了自修改代码”+“函数指针是自修改代码的一种形式”=您实际上并不知道自修改代码是什么意思。
标签: c self-modifying