BCL中的许多方法都标有 [MethodImpl(MethodImplOptions.InternalCall)]属性.这表明 "方法是在公共语言运行时本身内实现的".
以这种方式设计框架的重点是指定了运行时将被强制实现的显式CIL指令?最终,该属性正在为运行时创建合同义务,但在某种程度上,我觉得这种方式令人困惑,而且不是很明显.
例如,Math.Pow本来可以用这种方式编写(请原谅我非正式的C#+ IL和IL本身,如果它不好的话;这只是一个解释我的观点的样本):
public static double Pow(double x, double y)
{
ldarg.0
ldarg.1
pow // Dedicated CIL instruction
ret
}
Run Code Online (Sandbox Code Playgroud)
而不是当前的方式:
[MethodImpl(MethodImplOptions.InternalCall)]
public static double Pow(double x, double y);
Run Code Online (Sandbox Code Playgroud)
为什么MethodImplOptions.InternalCall存在?
为了创建一个受 Unity3d 启发的游戏引擎,我想将这个关于Unity 的 GetComponent如何工作的问题扩展到 Unity 的FindObjectsOfType<T>()工作方式。
期望返回所有指向<T>场景中存在的对象的指针。
我知道 Unity 在 C++ 中实现它,但是如何实现?对象可以是 Unity 中的任何东西,并且 Unity 的解决方案可以容忍继承。
该统一描述说,它是缓慢的,但为什么呢?我可以想象它可能是使用动态转换的数组搜索。我正在考虑使用 实现此功能unordered_multimap,但这会使查找基类的用例变得更加困难。
让开发人员在其实现上调用宏对我来说是不正确的。用户必须可以无障碍地自由编码。
另一个问题是:考虑到这一点,智能指针的所有者是谁:
GameObject也有自己的实现,GetComponents<T>()其中 Component 也是一个对象。如果我有一个附加了GameObject多个Component相同类型的类(HingeJoint为了示例目的,我们将其称为此类型),HingeJoint如果我GetComponent<HingeJoint>()在我的函数上调用该函数,我将获得哪个组件GameObject调用该函数,我将获得哪个组件?
根据我的研究,这个答案声称 Unity 将简单地返回 s 数组中的第一个匹配项Component- 然而,这个答案只是基于回答者自己的游戏引擎设计的有根据的猜测,该设计致力于模仿 Unity,而不是权威来源Unity 实际做了什么。
是否可以在类中创建非静态模板字段?
如果没有,如何解决?
应根据需要在编译时创建此类字段.
我有很多的B-class一样B1,B2,B3.
(在实际情况中,他们有更有意义的名字.)
我想创建一个类D有非静态模板函数add<BX>()是必须counter++每次我称呼它,每一个人的时间BX,对于D的特定情况下
(在现实情况下,它确实有些事情更复杂.)
这是一个实现它的工作演示.
可悲的是,我现在有硬编码每一个BX,一个接一个(B1,B2,B3内部)D: -
class B1{};class B2{};class B3{};
class Counter{
public: int counter=0;
};
template<class BX>class Tag{};
class D{
Counter countB1;
Counter countB2;
Counter countB3;
public: template<class BX> void add(){
add_(Tag<BX>());
}
private:
void add_(Tag<B1>){ countB1.counter++;}
void add_(Tag<B2>){ countB2.counter++;}
void add_(Tag<B3>){ countB3.counter++;}
public: …Run Code Online (Sandbox Code Playgroud) c++ ×2
.net ×1
c# ×1
c++14 ×1
cil ×1
clr ×1
components ×1
gameobject ×1
non-static ×1
templates ×1