Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中容纳嵌套的不安全结构#_C#_C++_C_Struct_Unsafe - Fatal编程技术网

C# 在C语言中容纳嵌套的不安全结构#

C# 在C语言中容纳嵌套的不安全结构#,c#,c++,c,struct,unsafe,C#,C++,C,Struct,Unsafe,满足以下条件的最佳方式是什么: 与本机C dll接口以与专有后端通信的实时、性能关键型应用程序 本机api有成百上千的结构、嵌套结构和通过这些结构来回传递数据的方法 想要将c#用于逻辑,所以决定使用不安全的c#来支持cli和封送处理。我知道如何实现这一点,并已通过后者实现,因此请不要回答“使用cli”。每秒一百次封送数百个结构会带来足够大的延迟,因此有必要调查不安全的c# 大多数c结构包含几十个字段,因此正在寻找一种方法对每个字段进行最少的键入。此时,需要运行一个VS宏,在必要时将每个行元素转换

满足以下条件的最佳方式是什么:

与本机C dll接口以与专有后端通信的实时、性能关键型应用程序

本机api有成百上千的结构、嵌套结构和通过这些结构来回传递数据的方法

想要将c#用于逻辑,所以决定使用不安全的c#来支持cli和封送处理。我知道如何实现这一点,并已通过后者实现,因此请不要回答“使用cli”。每秒一百次封送数百个结构会带来足够大的延迟,因此有必要调查不安全的c#

大多数c结构包含几十个字段,因此正在寻找一种方法对每个字段进行最少的键入。此时,需要运行一个VS宏,在必要时将每个行元素转换为c#等效设置数组,使其固定大小。在我找到一个嵌套结构数组之前,这一切都很好。例如,我有两个结构:

[StructLayout(LayoutKind.Sequential,Pack=1)]
unsafe struct User{
    int id;
    fixed char name[12];
}

[StructLayout(LayoutKind.Sequential,Pack=1)]
unsafe structs UserGroup{
    fixed char name[12];
    fixed User users[512]
    int somethingElse;
    fixed char anotherThing[16]
}
适应固定用户[512]的最佳方式是什么,以便在运行时不必做太多工作

我看到过一些例子,其中的建议是这样做的

[StructLayout(LayoutKind.Sequential,Pack=1)]
unsafe structs UserGroup{
    fixed char name[12];
    User users_1;
    User users_2;
    ...
    User users_511;
    int somethingElse;
    fixed char anotherThing[16]
}
另一个想法是,计算用户的大小(以字节为单位),然后这样做

[StructLayout(LayoutKind.Sequential,Pack=1)]
unsafe structs UserGroup{
    fixed char name[12];
    fixed byte Users[28*512];
    int somethingElse;
    fixed char anotherThing[16]
}
但这意味着每次需要使用这个结构时,我都必须对它进行特殊处理,或者用其他代码将其包装起来。api中有足够多的工具,我希望避免使用这种方法,但是如果有人能够演示一种优雅的方法,我也可以使用它

第三种方法是为用户指定大小,或者以某种方式使其严格大小,以便您可以在其上使用“固定”关键字,但我无法生成和示例(我想我在某处看到了,但再也找不到了)


有谁能推荐一种合理的方法,使其在负载下能够很好地利用和扩展吗?

在不安全的结构中找到嵌套结构的最佳方法是将它们定义为固定字节数组,然后为字段提供运行时转换属性。例如:

[StructLayout(LayoutKind.Sequential,Pack=1)]
unsafe struct UserGroup{
    fixed char name[12];
    fixed User users[512]
    int somethingElse;
    fixed char anotherThing[16]
}
变成:

[StructLayout(LayoutKind.Sequential,Pack=1)]
unsafe struct UserGroup{
    fixed char name[12];
    fixed byte users[512 * Constants.SizeOfUser]
    int somethingElse;
    fixed char anotherThing[16];
    public User[] Users
    {
        get
        {
            var retArr = new User[512];
            fixed(User* retArrRef = retArr){
                fixed(byte* usersFixed = users){
                    {
                        Memory.Copy(usersFixed, retArrRef,  512 * Constants.SizeOfUser);
                    }
                }
            }
            return retArr;
        }
    }
}
请注意,此代码使用内存。此处提供了复制功能:

geter的一般说明如下:

  • 为返回值分配一个托管数组
  • 获取并修复指向它的不安全指针
  • 获取并修复指向结构的字节数组的不安全指针
  • 将内存从一个复制到另一个

  • 托管阵列没有存储回其自身结构的原因是,它将修改其布局并不再正确转换,而从非托管阵列获取时,道具没有问题。或者,可以将其包装在另一个进行存储的托管对象中。

    我非常希望得到一些反馈,因为我不知道这在压力下会有什么表现