1

我一直在尝试将一些 C# 代码转换为 C++/CLI 代码(出于某些性能原因,以及避免一堆互操作问题),但是我碰壁了。诚然,我缺乏 C++/CLI 知识(绝对是最好的)。

尝试转换我们用于大小缓存的通用静态类被证明是一个令人头疼的问题。

C#类如下;

public static class SizeCache<T>
{
    public static 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;
};

但是,当我通过以下方式访问它时,一切似乎都可以正常编译;

int size = SizeCache<T>::Size;

我得到编译器错误。

错误 C2039:“大小”:不是“全局命名空间”的成员

错误 C2065:“大小”:未声明的标识符

不幸的是,在这种情况下,我看不出我做错了什么。

之所以首先使用该类,是为了避免 Marshaler 的一些问题(特别是在处理泛型结构类型时),并避免在相同的基本类型上不断调用 SizeOf 导致的性能损失。

我在这里做错了什么?

4

1 回答 1

0

请注意,即使代码是用 C++/CLI 编写的,对 Marshal::SizeOf 的调用仍然是托管调用。即使您成功编译了代码,我也不希望有任何性能改进。

您是否尝试将结果缓存在哈希表中而不是诉诸 C++/CLI?

我刚刚测试了您的代码,它运行良好(只需复制/粘贴下面的代码):

    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;
}
于 2013-09-15T12:16:13.487 回答