C# C++/CLI通用静态类
我一直在尝试将一些C#代码转换为C++/CLI代码(出于某些性能原因,以及避免一系列互操作问题),但我遇到了麻烦。诚然,我缺乏C++/CLI知识(最好是) 尝试转换我们用于大小缓存的通用静态类被证明是一个非常头痛的问题 C#类如下:C# C++/CLI通用静态类,c#,generics,c++-cli,C#,Generics,C++ Cli,我一直在尝试将一些C#代码转换为C++/CLI代码(出于某些性能原因,以及避免一系列互操作问题),但我遇到了麻烦。诚然,我缺乏C++/CLI知识(最好是) 尝试转换我们用于大小缓存的通用静态类被证明是一个非常头痛的问题 C#类如下: public static class SizeCache<T> { public static int Size = Marshal.SizeOf(typeof(T)); } 公共静态类SizeCache { 公共静态int Size=Mar
public static class SizeCache<T>
{
public static int Size = Marshal.SizeOf(typeof(T));
}
公共静态类SizeCache
{
公共静态int Size=Marshal.SizeOf(typeof(T));
}
C++/CLI包装器(据我所知)如下所示:
generic <typename T>
public ref class SizeCache abstract sealed
{
private:
static SizeCache()
{
Size = Marshal::SizeOf(T::typeid);
}
public:
static int Size;
};
通用
公共引用类SizeCache摘要密封
{
私人:
静态SizeCache()
{
Size=Marshal::SizeOf(T::typeid);
}
公众:
静态整数大小;
};
然而,当我通过访问它时,一切似乎都很好
int size = SizeCache<T>::Size;
int size=SizeCache::size;
我得到编译器错误
错误C2039:“大小”:不是“全局命名空间”的成员
错误C2065:“大小”:未声明的标识符
不幸的是,我看不出在这种情况下我做错了什么
创建该类的原因首先是为了避免封送拆收器出现一些问题(特别是在处理泛型结构类型时),并避免对相同的基本类型不断调用SizeOf而导致的性能损失
这里我做错了什么?请注意,即使代码是用C++/CLI编写的,对Marshal::SizeOf的调用仍然是一个托管调用。即使您成功编译了代码,我也不期望任何性能改进 您是否尝试过使用C++/CLI在哈希表中缓存结果 我刚刚测试了你的代码,它工作得很好(只需复制/粘贴下面的代码):
使用名称空间系统;
使用名称空间System::Runtime::InteropServices;
通用的
公共引用类SizeCache摘要密封
{
私人:
静态SizeCache()
{
Size=Marshal::SizeOf(T::typeid);
}
公众:
静态整数大小;
};
int main(数组^args)
{
双dsize=SizeCache::Size;
int size=SizeCache::size;
返回0;
}
转换为C++/CLI不仅仅适用于这种特定情况。它主要用于图书馆的其他更大部分。将其存储在哈希表(或字典,或任何其他变体)中基本上消除了使用静态泛型类的原因。这使我可以一次性完成特定类型的所有反射工作,并且在以后再次使用该类型时不会产生查找惩罚。我认为您引用的错误消息位于错误列表的一半。您应该首先得到未知SizeCache标识符的诊断,这是编译器认为大小在全局命名空间中的唯一可行方法。从列表的顶部开始。
using namespace System;
using namespace System::Runtime::InteropServices;
generic <typename T>
public ref class SizeCache abstract sealed
{
private:
static SizeCache()
{
Size = Marshal::SizeOf(T::typeid);
}
public:
static int Size;
};
int main(array<System::String ^> ^args)
{
double dsize = SizeCache<double>::Size;
int size = SizeCache<int>::Size;
return 0;
}