【问题标题】:public value struct in WinRTWinRT 中的公共值结构
【发布时间】:2011-12-03 16:26:54
【问题描述】:

为什么“public value struct”不能有任何方法或构造函数,而“value struct”可以? 如何在 WinRT 组件库中编写类似“Vector3”的结构并在另一个 WinRT 应用程序中使用?

【问题讨论】:

    标签: directx windows-runtime c++-cx


    【解决方案1】:

    当您将结构声明为“公共”时,您将其声明为 Windows 运行时结构。 Windows 运行时中的结构是值类型。它们不能有方法(或构造函数)。

    它们也按值编组,这可能不是您想要的。

    您可能希望创建一个类而不是结构。

    【讨论】:

    • +1。但是,从性能的角度来看,将数据和方法拆分为一个结构和一个类可能比在这种情况下拥有一个类更好(即Vector3)。顺便说一句,WinRT 中的结构和类是否类似于 .NET,因为只有结构可以在堆栈上分配(因此更快)?
    • 结构是值类型,因此通常只在堆栈上分配,但在某些情况下它们会在堆上分配(例如结构数组)。但是因为它们是值类型,所以它们是按值传递的——这意味着如果你编写一个接受结构的 API,结构内容会在堆栈上复制到被调用者。这可能非常昂贵。
    • 因此,.NET 和 WinRT 中的情况类似。结构的分配更便宜(差异应该更大,因为托管堆上的分配更便宜),并且复制比引用类型更昂贵,尤其是在大小很大的情况下。应该使用分析。
    【解决方案2】:

    值类型/结构被映射为内存的“块”,很像传统的 C 结构,而不是 .Net 的实现,即:它可以包含字段和方法..

    所以值类型只需要在其中包含字段或构造函数。

    您需要将 Vector3 拆分为两部分,其中一部分包含可能称为 Vector3Data 的数据,而 Vector3 具有操作它所需的所有方法。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多