C 中的自修改代码是否可以以可移植的方式实现?
我问的原因是,在某种程度上,OOP 依赖于自修改代码(因为在运行时执行的代码实际上是作为数据生成的,例如在 v 表中),但是,似乎如果这太过分了,它会阻止编译器中的大多数优化。
例如:
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 中是不可能的,其中最重要的是:
- 编译器生成的代码完全取决于编译器,并且可能看起来与试图编写修改自身的代码的程序员所期望的完全不同。这是一个基本的做 SMC 根本就是个问题,而不仅仅是可移植性问题。
- C 中函数指针和数据指针是完全分开的;该语言无法在它们之间来回转换。这个问题不是根本问题,因为某些实现或更高级别的标准 (POSIX) 保证代码和数据指针共享表示。
除此之外,自修改代码实在是一个非常糟糕的主意。 20 年前它可能有一些用途,但现在它只会导致错误、糟糕的性能和可移植性失败。请注意,在某些 ISA 上,指令缓存是否能够看到对缓存代码所做的更改可能是未指定/不可预测的!
最后,虚函数表与自修改代码无关。纯粹是修改函数的问题pointers,它们是数据,而不是代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)