为什么C++需要语言修改才能"管理"?

sha*_*kin 9 .net c++ clr c++-cli managed-code

为什么不能在编译器编写的管理需要进行什么管理中的C++代码(即,使其"CLR兼容")?

也许有一些妥协,比如在某些情况下禁止无效指针等等.但所有这些额外的关键词等等.这些新增内容必须解决的问题是什么?

我对某些方面以及可能难以解决的问题有所了解,但我们将非常感谢一个很好的解释!

MSa*_*ers 12

到目前为止,我不得不对这些答案持不同意见.

要理解的主要问题是C++编译器创建的代码适用于非常愚蠢的环境.即使是现代的CPU也不了解虚拟功能,地狱甚至功能都是一个延伸.例如,CPU实际上并不关心用于展开堆栈的异常处理代码是否在任何函数之外.CPU处理指令序列,具有跳转和返回.就CPU而言,函数当然没有名称.

因此,编译器会将支持函数概念所需的一切都放在那里.例如,vtable只是正确大小的数组,从CPU角度来看具有正确的值.__func__最终作为字符串表中的字节序列,其中最后一个是00.

现在,没有任何迹象表明目标环境必须是愚蠢的.你绝对可以定位JVM.同样,编译器必须填写本机提供的内容.没有原始记忆?然后分配一个大字节数组并改为使用它.没有原始指针?只需将整数索引用于该大字节数组即可.

主要问题是C++程序在托管环境中看起来很难以识别.JVM并不笨,它知道函数,但它希望它们是类成员.它并不指望他们拥有<>以他们的名义.你可以规避这一点,但你最终得到的基本上是名称错误.与今天的名称修改不同,这种名称修改不适用于C链接器,而是适用于智能环境.因此,它的反射引擎可能会确信有一个c__plus__plus具有成员函数的类__namespace_std__for_each__arguments_int_pointer_int_pointer_function_address,这仍然是一个很好的例子.我不想知道如果你有一个std::map字符串来反转迭代器会发生什么.

相反,另一种方式实际上更容易.几乎所有其他语言的抽象都可以用C++进行按摩.垃圾收集?今天C++已经允许这样做了,所以你甚至可以支持它void*.

我没有提到的一件事是表现.在大字节数组中模拟原始内存?这不会很快,特别是如果你把双打.你可以玩很多技巧来加快速度,但价格是多少?你可能不会得到商业上可行的产品.事实上,你可能会使用一种语言,它将C++的最糟糕部分(许多不寻常的依赖于实现的行为)与VM的最差部分(慢)结合起来.