使用联合与多个结构

Posted

技术标签:

【中文标题】使用联合与多个结构【英文标题】:Using Unions vs Multiple structs 【发布时间】:2019-06-12 05:08:20 【问题描述】:

我是 C++ 的新手,有时我不确定什么是更好的性能/内存方式。我的问题是我需要具有两个指向 vec3(3 个浮点数)和 vec3/vec2 的指针的结构。

现在我正在尝试决定是否使用: - 具有两个构造函数的联合,一个用于 vec3,一个用于 vec2 - 创建两个结构,一个将包含 vec2 和一个 vec3

struct vec3

    float x,y,z;
;
struct vec2

    float x,y;
;
struct Vertex

    template <typename F>
    Vertex(vec3 *Vertices,F Frag)
    : m_vertices(Vertices),m_fragment(Frag)
    

    union Fragment
    
        Fragment(vec3 *Colors)
        :colors(Colors)
        
        Fragment(vec2 *Texcoords)
        :texcoords(Texcoords)
        

        vec3 *colors;
        vec2 *texcoords;

     m_fragment;


    vec3 * m_vertices;

这段代码运行良好,但我很担心性能,因为我打算经常使用 Vertex 结构,我的程序可能有数千个 Vertex 结构实例。

【问题讨论】:

"thousand" 没什么好担心的。 测量是唯一真正停止担心的方法。程序中真正的瓶颈位于您没想到的地方是很常见的。如果你还没有一个像样的分析器,那么一定要去购物。 附注:如果要使用这些向量执行向量计算,可以使用Eigen::Vector2fEigen::Vector3f。比为他们实现自己的结构和程序更简单、更容易 谢谢,但我已经使用 lib 作为向量,我现在无法发送我的代码,这只是代表我的问题的副本。 【参考方案1】:

如果每个Vertex 可以有任何一个 colorstexcoords,但不能两者兼有,那么union(或者更好的是std::variant&lt;vec3, vec2&gt;)是有意义的。 p>

如果Vertex 可以同时拥有colorstexcoords,那么union 将不起作用,因为union 中只有一个成员可以在时间。

至于性能,简介,简介,简介。以这样一种方式构建您的界面,即union 或单独成员的选择对调用者是不可见的。然后以两种方式实现它并测试哪个性能更好(或者是否有明显的差异)。

【讨论】:

以上是关于使用联合与多个结构的主要内容,如果未能解决你的问题,请参考以下文章

结构体与联合体的区别

c# 中的联合与 StructLayout

结构体和联合体

联合索引-以及如何使用索引

使用多个联合优化查询性能

你如何与多个 CTE 联合?