在C中可以以可移植的方式实现自修改代码吗?
我问的原因是,在某种程度上,OOP依赖于自修改代码(因为在运行时执行的代码实际上是作为数据生成的,例如在v表中),但是,似乎,如果这太过分了,它会阻止编译器中的大多数优化.
例如:
void add(char *restrict p, char *restrict pAddend, int len)
{
for (int i = 0; i < len; i++)
p[i] += *pAddend;
}
Run Code Online (Sandbox Code Playgroud)
优化编译器可以提升*pAddend循环,因为它不会干扰p.但是,这不再是自修改代码中的有效优化.
通过这种方式,似乎C不允许自修改代码,但同时,这不意味着你不能在C中做一些像OOP这样的事情吗?C真的支持自修改代码吗?
由于多种原因,C中无法实现自修改代码,其中最重要的是:
除此之外,自修改代码只是一个非常糟糕的主意.20年前它可能有一些用途,但现在它只会导致错误,恶劣的性能和可移植性失败.请注意,在某些ISA上,指令缓存是否甚至看到对缓存代码所做的更改可能是未指定/不可预测的!
最后,vtable与自修改代码无关.这纯粹是修改函数指针的问题,函数指针是数据,而不是代码.